• 树的遍历


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<queue>
    #include<algorithm>
    
    using namespace std;
    
    typedef struct node
    {
        node():data(' '), lchild(NULL), rchild(NULL) {}
        char data;
        struct node* lchild;
        struct node* rchild;
    } BinTreeNode, *BinTree;
    
    void Preorder(BinTree t)
    {
        if(t)
        {
            putchar(t->data);
            Preorder(t->lchild);
            Preorder(t->rchild);
        }
    }
    
    void Non_Preorder(BinTree t)
    {
        BinTree T=t;
        stack<BinTree> S;
        while(T || !S.empty())
        {
            while(T)
            {
                putchar(T->data);
                S.push(T);
                T=T->lchild;
            }
            if(!S.empty())
            {
                T=S.top();
                S.pop();
                T=T->rchild;
            }
        }
    }
    
    void Inorder(BinTree t)
    {
        if(t)
        {
            Inorder(t->lchild);
            putchar(t->data);
            Inorder(t->rchild);
        }
    }
    
    void Non_Inorder(BinTree t)
    {
        BinTree T=t;
        stack<BinTree> S;
        while(T || !S.empty())
        {
            while(T)
            {
                S.push(T);
                T=T->lchild;
            }
            if(!S.empty())
            {
                T=S.top();
                putchar(T->data);
                S.pop();
                T=T->rchild;
            }
        }
    }
    
    void Posorder(BinTree t)
    {
        if(t)
        {
            Posorder(t->lchild);
            Posorder(t->rchild);
            putchar(t->data);
        }
    }
    /**要保证根结点在左孩子和右孩子访问之后才能访问,
    因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,
    则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,
    则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候
    ,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。**/
    void Non_Posorder(BinTree t)
    {
        BinTree T=t, pre=NULL;
        stack<BinTree> S;
    
        S.push(T);
        while(!S.empty())
        {
            T=S.top();
            if((T->lchild==NULL&&T->rchild==NULL) || (pre!=NULL&&(pre==T->lchild || pre==T->rchild)))
            {
                putchar(T->data);
                S.pop();
                pre=T;
            }
            else
            {
                if(T->rchild!=NULL)
                    S.push(T->rchild);
                if(T->lchild!=NULL)
                    S.push(T->lchild);
            }
        }
    }
    
    void Leveorder(BinTree t)
    {
        BinTree T=t;
        if(!T)return ;
        queue<BinTree> Q;
        Q.push(T);
    
        while(!Q.empty())
        {
            T=Q.front();
            Q.pop();
            putchar(T->data);
            if(T->lchild)
                Q.push(T->lchild);
            if(T->rchild)
                Q.push(T->rchild);
        }
    }
    void CreatBinTree(BinTree &T)
    {
        char ch;
        scanf("%c", &ch);
        if(ch=='#')
            T=NULL;
        else
        {
            T=new BinTreeNode;
            T->data=ch;
            CreatBinTree(T->lchild);
            CreatBinTree(T->rchild);
        }
    }
    
    int main()
    {
        BinTree T;
        CreatBinTree(T);
    
        printf("前序递归遍历二叉树:
    ");
        Preorder(T);
        puts("");
        printf("前序非递归遍历二叉树:
    ");
        Non_Preorder(T);
        puts("");
    
        printf("中序递归遍历二叉树:
    ");
        Inorder(T);
        puts("");
        printf("中序非递归遍历二叉树:
    ");
        Non_Inorder(T);
        puts("");
    
        printf("后序递归遍历二叉树:
    ");
        Posorder(T);
        puts("");
        printf("后序非递归遍历二叉树:
    ");
        Non_Posorder(T);
        puts("");
    
        printf("层次遍历二叉树:
    ");
        Leveorder(T);
        puts("");
    
        return 0;
    }
    /*
    ab#d##c#e##
    abd##e##cf##g##
    */
  • 相关阅读:
    final关键字
    Eclipse中web项目部署至Tomcat步骤
    tomcat动态部署和静态部署
    eclipse中导入MyEclipse的项目,不能添加到tomcat v6.0中
    【面向对象核心】动态绑定和多态
    java对象转型体现可扩展性
    java对象转型
    重写equals和toString例子
    equals的重写
    object类 & toString方法
  • 原文地址:https://www.cnblogs.com/w-y-1/p/6710855.html
Copyright © 2020-2023  润新知