• 树的遍历(非递归)


    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <stack>

    using namespace std;
    int z[30],h[30];
    class Tree
    {
    public:
        int data;
        Tree *lchild;
        Tree *rchild;
        Tree()
        {
            lchild=NULL;
            rchild=NULL;
        }
    }*root;
    Tree *CreatNode()
    {
        Tree *root=new Tree();
        return root;
    }
    Tree *RestoreTree(int z1,int z2,int h1,int h2)
    {
        Tree *root=CreatNode();
        root->data=h[h2];
        for(int i=0;z2-i>=z1;i++)
        {
            if(z[z2-i]==h[h2])
            {
                if(i>0)root->rchild=RestoreTree(z2-i+1,z2,h2-i,h2-1);
                if(z2-i>z1)root->lchild=RestoreTree(z1,z2-i-1,h1,h2-i-1);
                break;
            }
        }
        return root;
    }
    void FDpostOrder(Tree *root)///非递归后序遍历。。更新了一下写法
    {
        stack<Tree*>q;
        Tree *temp=root;
        Tree *p;
        while(temp!=NULL||!q.empty())
        {
            while(temp!=NULL)
            {
                q.push(temp);
                temp=temp->lchild;
            }
            if(q.top()->rchild!=NULL)///右儿子不为空,则入栈
            {
                temp=q.top()->rchild;
            }
            else
            {
                p = q.top();
                q.pop();
                cout<<p -> data<<' ';
                while(!q.empty() && (q.top() -> rchild == NULL || q.top() -> rchild == p))//栈不空是前提,右儿子为空或者右儿子入过栈了且已经出栈了满足输出条件。
                {
                    p = q.top();
                    q.pop();
                    cout<<p -> data<<' ';
                }
            }
        }
    }
    void FDinOrder(Tree *root)
    {
        stack<Tree*>q;
        Tree *temp=root;
        while(temp||!q.empty())///非递归中序遍历,及时栈空了,temp不空,仍然继续
        {
            while(temp!=NULL)
            {
                q.push(temp);
                temp=temp->lchild;
            }
            temp=q.top()->rchild;
            cout<<q.top()->data<<' ';
            q.pop();
        }
    }
    void FDpreOrder(Tree *root)///非递归前序遍历
    {
        stack<Tree*>q;
        Tree *temp=root;
        while(temp||!q.empty())
        {
            while(temp!=NULL)
            {
                q.push(temp);
                cout<<temp->data<<' ';
                temp=temp->lchild;
            }
            temp=q.top()->rchild;
            q.pop();
        }
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>h[i];
        for(int i=0;i<n;i++)
            cin>>z[i];
        root=RestoreTree(0,n-1,0,n-1);
        FDpreOrder(root);
        cout<<endl;
        FDinOrder(root);
        cout<<endl;
        FDpostOrder(root);
        cout<<endl;
        return 0;
    }

  • 相关阅读:
    【控件推荐】Html编辑器控件 CuteEditor
    【ASP.NET】网页中嵌入视频
    【经验分享】ASP.NET 项目中用到的广告效果
    【转贴好文】服务器概述
    【经验分享】取某月的最后一天的方法
    【经验分享】Word无法使用鼠标选中问题解决
    【经验分享】Sqlserver和Oracle混合事务
    【编码之外】2009春节前最后一天班,感谢一下帮助过我的朋友
    【转贴好文】做快乐的程序员
    【经验分享】JavaScript 中的事件说明
  • 原文地址:https://www.cnblogs.com/8023spz/p/7347984.html
Copyright © 2020-2023  润新知