zoukankan      html  css  js  c++  java
  • 树的所有实现

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXSIZE 1000
    typedef struct Linklist
    {
        char data;
        struct Linklist *lchild,*rchild;
    }Node;
    Linklist* init()
    {
        Linklist* tmp=new Node;
        tmp->lchild=NULL;
        tmp->rchild=NULL;
        return tmp;
    }
    void creat(Linklist* &root)
    {
        char c;
        scanf("%c",&c);
        if(c=='#')
        {
            root=NULL;
        }
        else
        {
            root=new Node;
            root->data=c;
            creat(root->lchild);
            creat(root->rchild);
        }
    }
    
    void forder(Linklist* &root)
    {
        if(root)
        {
            cout<<root->data<<' ';
            forder(root->lchild);
            forder(root->rchild);
        }
    }
    void morder(Linklist* &root)
    {
        if(root)
        {
            morder(root->lchild);
            cout<<root->data<<' ';
            morder(root->rchild);
        }
    }
    void border(Linklist* &root)
    {
        if(root)
        {
            border(root->lchild);
            border(root->rchild);
            cout<<root->data<<' ';
        }
    }
    
    void Morder(Linklist* &root)
    {
        Linklist* Stack[MAXSIZE];
        Linklist* p=root;
        int top=0;
        if(root==NULL)
        {
            cout<<"该二叉树为空树"<<endl;
            return;
        }
        while(p!=NULL||top!=0)
        {
            while(p!=NULL)
            {
                if(top<MAXSIZE)///压栈
                {
                    Stack[top++]=p;
                }
                else
                {
                    cout<<"栈溢出"<<endl;
                }
                p=p->lchild;
            }
            if(top<=0)///栈为空结束
            {
                return;
            }
            else
            {
                p=Stack[--top];
                cout<<p->data<<' ';
                p=p->rchild;
            }
        }
    }
    
    int depth(Linklist* L)
    {
        if(L==NULL)
        {
            return 0;
        }
        int m=depth(L->lchild);
        int n=depth(L->rchild);
        return max(m+1,n+1);
    }
    
    int cntnode(Linklist* L)
    {
        if(L==NULL)
        {
            return 0;
        }
        return cntnode(L->lchild)+cntnode(L->rchild)+1;
    }
    int main()
    {
        int menu;
        Linklist* root=NULL;
            printf("---------------------菜单-----------------
    ");
            printf("-----1、前序遍历生成二叉树----------------
    ");
            printf("-----2、前序遍历上述生成的二叉树----------
    ");
            printf("-----3、中序遍历上述生成的二叉树----------
    ");
            printf("-----4、后序遍历上述生成的二叉树----------
    ");
            printf("-----5、使用非递归方式中序遍历二叉树;----
    ");
            printf("-----6、输出二叉树的深度------------------
    ");
            printf("-----7、输出二叉树的节点个数--------------
    ");
            printf("-----0、退出------------------------------
    ");
            ///ABC##DE#G##F###
        while (1)
        {
            printf("请输入:");
            scanf("%d",&menu);
            getchar();
            if(menu==1)
            {
                root=init();
                cout<<"请按照前序排列输入二叉树(以#结束)"<<endl;
                creat(root);
            }
            else if(menu==2)
            {
                if(root==NULL)
                {
                    cout<<"二叉树为空"<<endl;
                }
                else
                {
                    cout<<"前序为:";
                    forder(root);
                    cout<<'
    ';
                }
            }
            else if(menu==3)
            {
                if(root==NULL)
                {
                    cout<<"二叉树为空"<<endl;
                }
                else
                {
                    cout<<"中序为:";
                    morder(root);
                    cout<<'
    ';
                }
            }
            else if(menu==4)
            {
                if(root==NULL)
                {
                    cout<<"二叉树为空"<<endl;
                }
                else
                {
                    cout<<"后序为:";
                    border(root);
                    cout<<'
    ';
                }
            }
            else if(menu==5)
            {
                if(root==NULL)
                {
                    cout<<"二叉树为空"<<endl;
                }
                else
                {
                    cout<<"使用非递归方法计算中序为:";
                    Morder(root);
                    cout<<'
    ';
                }
            }
            else if(menu==6)
            {
                cout<<"二叉树的深度为:"<<depth(root)<<'
    ';
            }
            else if(menu==7)
            {
                cout<<"二叉树的节点数为:"<<cntnode(root)<<'
    ';
            }
            if(menu==0)
            {
                break;
            }
        }
    }
  • 相关阅读:
    不错的计算机免费电子书网站
    十点提高编程技巧
    delphi 通过TStyleManager设置主题类型
    delphi 简体和繁体字符串转换
    delphi unidac 连接mysql
    Delphi 的字符及字符串 string、AnsiString、WideString、String[n]、ShortString
    delphi format格式
    AnsiString和WideString 区别
    企业级Docker私有仓库部署(https)
    企业级Docker私有仓库之Harbor部署(http)
  • 原文地址:https://www.cnblogs.com/ranzhong/p/13792915.html
Copyright © 2011-2022 走看看