非递归后序遍历

一、算法

第一步:先调用循环遍历左子树,同时入栈元素。
第二步:左子树调用完成之后,访问栈空间,对于栈顶元素判断是否访问过右子树
  ①若未访问:则将p指针指向右子树,然后对右子树进行 第一步
  ②若已访问:则栈顶元素出栈,并打印内容
第三步:循环上述过程,直到栈为空

二、代码

1、结构体定义:

typedef struct node {
    int data;
    node *l;
    node *r; 
    bool vis;//是否访问过右子树
}*Tree,node; 

2、非递归后序遍历函数

void stPrint(Tree tree) {
    node *p = tree;
    stack<node *> s;
    do {
        while(p!=NULL) {
            p->vis = false;
            s.push(p);
            p = p->l;
        }
        while(!s.empty()) {
            node *top = s.top();
            if(top->vis == true) {//已经访问过右子树了 
                cout << top->data << " ";
                s.pop();
            } else {//右子树还没访问 
                p = top->r;
                top->vis = true;
                break;
            }
        }
    } while(!s.empty());
}

三、参考视频

二叉树后序遍历非递归 https://www.bilibili.com/video/BV1up411R7NB?t=752

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容