常用数序结构与算法之后续非递归遍历二叉树

二叉树的非递归遍历中,前序和后续基本一致,比较简单,后续非递归遍历稍微复杂些,需要判断是从左子树返回还是右子树返回,代码如下:

#include <iostream>
#include <stack>
#include <string>
struct treeNode{
        treeNode*lChild;
        treeNode*rChild;
        char data;
};
typedef treeNode* biTree;
const char deli='^';
/*using preOrderTraverse to create binary tree*/
void createTree(biTree& pTree){
        char c=deli;
        std::cin>>c;
        if(c==deli){
                pTree=NULL;
                return;
        }
        pTree=new treeNode;
        pTree->data=c;
        createTree(pTree->lChild);
        createTree(pTree->rChild);
}

void visit(biTree pNode){
        if(pNode==NULL)
                ;//std::cout<<deli;
        else
                std::cout<<pNode->data;
}
/*前序递归遍历,用于对比*/
void preOrderTraverse(biTree pTree,void(*v)(biTree pNode)){
        v(pTree);
        if(!pTree){
                return;
        }
        preOrderTraverse(pTree->lChild,v);
        preOrderTraverse(pTree->rChild,v);
}
/*后续非递归*/
void postOrderTraverse(biTree pTree,void(*v)(biTree pNode)){
        biTree p=pTree;
        std::stack<biTree> s;
        if(!p)
                return;
        s.push(p);
        while(p->lChild){
                p=p->lChild;
                s.push(p);
        }
        p=s.top();
        s.pop();
        visit(p);
        biTree T;
        while(!s.empty()){
                T=s.top();
                s.pop();
                if(T->lChild==p){
                        if(T->rChild){
                                s.push(T);
                                T=T->rChild;
                                s.push(T);
                                while(T->lChild){
                                        T=T->lChild;
                                        s.push(T);
                                }
                                p=s.top();
                                s.pop();
                                v(p);
                        }else{
                                v(T);
                                p=T;
                        }
                }else if(T->rChild==p){
                        v(T);
                        p=T;
                }
        }
}
int main(int argc,char**argv){
        biTree pTree;
        createTree(pTree);
        preOrderTraverse(pTree,visit);
        std::cout<<std::endl;
        postOrderTraverse(pTree,visit);
        std::cout<<std::endl;
}
前序建立二叉树的测试用例:

abdf^^^egi^^^h^^c^^






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值