二叉树遍历-非递归-Cpp代码-后序

#include<iostream>
#include<stack>
using namespace std;  

//定义二叉树结点链式存储结构
struct BiTNode{
        int data;//数据域
        struct BiTNode *lchild,*rchild;//左右孩子指针
}*BiTree;

//后序遍历函数声明
int PostOrder(struct BiTNode *BiTree);

int main()  
{
        //初始化结点
        struct BiTNode node1,node2,node3,node4,node5,node6,node7,node8,node9,node10,node11;
        node1=(struct BiTNode){7,&node2,&node3};
        node2=(struct BiTNode){3,&node4,&node5};
        node3=(struct BiTNode){6,&node6,&node7};
        node4=(struct BiTNode){1,NULL,NULL};
        node5=(struct BiTNode){2,NULL,NULL};
        node6=(struct BiTNode){4,NULL,NULL};
        node7=(struct BiTNode){5,NULL,NULL};

        //建树
        BiTree=&node1;

        PostOrder(BiTree);
        cout << endl;
        return 0;  
}

//后序遍历-非递归实现
int PostOrder(struct BiTNode *BiTree){
        stack<BiTNode*> s;
        struct BiTNode* p=BiTree;
        struct BiTNode* r=NULL;
        while(p||!s.empty()){
                if(p){ //走到最左边
                        s.push(p);
                        p=p->lchild;
                }
                else{ //向右
                        p=s.top(); //取栈顶结点
                        if(p->rchild&&p->rchild!=r){ //如果右子树存在且未被访问过
                                p=p->rchild; //转向右
                                s.push(p); //压入栈
                                p=p->lchild; //再走到最左
                        }else{  //否则,弹出节点并访问
                                p=s.top();
                                s.pop(); //弹出
                                cout << p->data << " "; //访问
                                r=p; //记录最近访问过的结点
                                p=NULL; //结点访问完后,重置p指针
                        }

                }//else
        }//while
        return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值