• 二叉树的简单实现即递归遍历


    #include<iostream>
    #include<stdio.h>
    #include<malloc.h>
    using namespace std;
    #define ElemType char
    #define MaxSize 100
    
    typedef struct node
    {
        ElemType data;
        struct node *lchild;
        struct node *rchild;
    }BTNode;
    
    void CreateBTree1(BTNode *&b,char *str)//由数组直接建立二叉树
    {
        BTNode *St[MaxSize];//St作为顺序栈
        BTNode *p;
        int top = -1;//top为栈顶指针
        int j = 0;
        int k ;
        char ch;
        ch = str[j];
        b = NULL;//初始二叉链为空
        while(ch != '')//循环str
        {
            switch(ch)
            {
                case '(': 
                    top++;  
                    St[top] = p;
                    k = 1;
                    break;//开始处理左孩子结点,
                case ')':
                    top--;
                    break;//栈顶结点的子树处理完毕
                case ',':
                    k = 2;  
                    break;//开始处理右孩子结点
                default://创立一个结点,p指向它
                    p = (BTNode*)malloc(sizeof(BTNode));
                    p->data = ch;//存放结点值
                    p->lchild = p->rchild = NULL;//左右孩子为空 
                    if(b == NULL)//若尚未建立头结点
                    {
                        b = p;//p所指即为根结点
                    }
                    else
                    {
                        switch(k)
                        {
                            case 1:
                                St[top]->lchild = p;
                                break;//新建结点为根结点左孩子
                            case 2:
                                St[top]->rchild = p;
                                break;//新建结点为根结点右孩子
                        }
                    
                    }
            }
            j++;
            ch = str[j];
        }
    }
    
    void CreateBTree2(BTNode *&b)//手动输入二叉树
    {
        b = NULL;
        char ch;
        ch = getchar();
        if(ch == '#')
        {
            b = NULL;
        }
        else
        {
            b = (BTNode *)malloc(sizeof(BTNode));
            b->data = ch;
            CreateBTree2(b->lchild);
            CreateBTree2(b->rchild);
        }
    }
    
    void  DispLeaf(BTNode *b)//Print All Leaf
    {
        if(b != NULL)
        {
            if(b->lchild == NULL && b->rchild == NULL)
            {
                cout<<b->data;
            }
            DispLeaf(b->lchild);//lchild leaf
            DispLeaf(b->rchild);//rhcild leaf 
            
        }
    }
    
    BTNode* FindNode(BTNode *b,ElemType x)//return a Node
    {
        BTNode *p;
        if(b == NULL)
        {
            return NULL;
        }
        else if(b->data == x)
        {
            return b;
        }
        else
        {
            p = FindNode(b->lchild,x);
            if(p != NULL)
            {
                return p;
            }
            else
            {
                return FindNode(b->rchild,x);
            }
        }
    }
    
    BTNode* LchildNode(BTNode *p)//return p lchild
    {
        return p->lchild;
    }
    
    BTNode* RchildNode(BTNode *p)//return p rchild
    {
        return p->rchild;
    }
    
    int BTHeight(BTNode *b)//return BTheigh
    {
        int lchildh,rchildh;
        if(b == NULL)
        {
            return (0);
        }
        else
        {
            lchildh = BTHeight(b->lchild);
            rchildh = BTHeight(b->rchild);
            return (lchildh >rchildh) ? (lchildh + 1): (rchildh + 1);
        }
    }
    
    int Level(BTNode *b,ElemType x,int h)//return Level
    {
       
        int level;
        if(b == NULL)
        {
            return (0);
        }
        else if(b->data == x)
        {
            return h;
        }
        else
        {
            level = Level(b->lchild,x,h+1);
            if(level != 0)
            {
                return level;
            }
            else
            {
                return (Level(b->rchild,x,h+1));
            }
        }
    }
    
    void DispBTree(BTNode *b)
    {
        if(b != NULL)
        {
            cout<<" "<<b->data;
            if(b->lchild != NULL || b->rchild !=  NULL)
            {
                cout<<"(";//有孩子结点才输出(
                DispBTree(b->lchild);//扫描左子树
                if(b->rchild != NULL)//有右子树才输出,
                {
                    cout<<",";
                }
                DispBTree(b->rchild);//递归处理右子树
                cout<<")";//有孩子结点才输出
            }
        }
    }
    
    void PreOrder(BTNode *b)
    {
        if(b != NULL)
        {
            cout<<" "<<b->data;
            PreOrder(b->lchild);
            PreOrder(b->rchild);
        }
    }
    
    void InOrder(BTNode *b)
    {
        if(b != NULL)
        {
            InOrder(b->lchild);
            cout<<" "<<b->data;
            InOrder(b->rchild);
        }
    }
    void PostOrder(BTNode *b) { if(b != NULL) { PostOrder(b->lchild); PostOrder(b->rchild); cout<<" "<<b->data; } } void DestoryBTree(BTNode *&b) { if(b != NULL) { DestoryBTree(b->lchild); DestoryBTree(b->rchild); free(b); } } int main() { //~~~~~~~~~~~~~~Create1 BTNode *b,*p,*lp,*rp; cout<<"BTree"<<endl; cout<<"create BTree"<<endl; char str[] ="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"; CreateBTree1(b,str); cout<<"PrintL: "; DispBTree(b); cout<<endl; cout<<"H Node"<<endl; p = FindNode(b,'H'); if(p!=NULL) { lp = LchildNode(p); if(lp!=NULL) { cout<<" lchild is "<<lp->data; } else { cout<<"No lchild !"<<endl; } rp = RchildNode(p); if(rp!=NULL) { cout<<" rchild is "<<rp->data; } else { cout<<"NO rchild !"<<endl; } } cout<<endl; cout<<"BTree Height is "<< BTHeight(b)<<endl; //~~~~Order!~~~ cout<<"PreOrder -> "; PreOrder(b); cout<<endl; cout<<"InOrder -> "; InOrder(b); cout<<endl; cout<<"PostOrder -> "; PostOrder(b); cout<<endl; cout<<"Leaf Node-> "; DispLeaf(b); cout<<endl; cout<<"H level is:"<<Level(b,'H',1)<<endl; cout<<"Free"<<endl; DestoryBTree(b); //~~~~~~~~~~~~~Create2 BTNode *b2; cout<<"Create 2"<<endl; CreateBTree2(b2); cout<<"PreOrder -> "; PreOrder(b2); cout<<endl; cout<<"InOrder -> "; InOrder(b2); cout<<endl; cout<<"PostOrder -> "; PostOrder(b2); cout<<endl; cout<<"Leaf Node-> "<<endl; DispLeaf(b2); cout<<endl; cout<<"Free"<<endl; DestoryBTree(b2); return 1; }

      

    这是运行后的结果,注意Create1 和Create2 创建二叉树的区别。。

  • 相关阅读:
    TestPaste text
    WPF XML序列化保存数据 支持Datagrid 显示/编辑/添加/删除数据
    C# WPF xml序列化 反序列化
    C# show FTP Download/Upload progress
    BAT for 循环
    C# httpRequest Soap请求
    day6 os模块
    day6 random随机数模块
    day6 time和datetime模块
    day5 常用模块json和pickle
  • 原文地址:https://www.cnblogs.com/ygsworld/p/9973347.html
Copyright © 2020-2023  润新知