[LeetCode]problem 145. Binary Tree Postorder Traversal

来源:互联网 发布:你还在我身旁 知乎 编辑:程序博客网 时间:2024/05/16 01:00

TAG

二叉树非递归后序遍历

基础重要

link

方法

不使用递归方法,就记得有一个关键,但是怎么都想不起来了。又想着给每个节点加个标志位了….

看了维基百科,知道了答案。

首先,后序遍历下,要访问该节点,必然是在从右孩子回来的回溯阶段

且一个重要的事实是——如果右孩子不为空,那个访问右孩子后必然访问该节点

由此,我们有了一个简单的方法来区分当前回溯阶段是从左边回溯还是右边。

定义一个变量lastVisitedNode , 当我们访问一个节点后,就更新该值为刚刚访问的节点。

在回溯时,查看要回溯节点的右孩子——

  1. 如果为空,说明刚刚是从左孩子回来,但此时需要直接访问该节点;

  2. 如果不为空,且该右孩子就是lastVisitedNode , 说明刚刚从右节点回溯回来。此时直接访问该节点;

  3. 如果不为空,且该右孩子不是lastVisitedNode , 说明从左孩子回来。将下一个遍历目标设为的右孩子。

代码

class Solution {public:    vector<int> postorderTraversal(TreeNode* root) {        TreeNode *pos = root ,                 *lastVisitedNode = nullptr ;        stack<TreeNode*> s ;        vector<int> traversalRst ;        while(!s.empty() || pos != nullptr)        {            if(pos != nullptr)            {                // step : visit left child                s.push(pos) ;                pos = pos->left ;            }            else            {                // step : backtrace                 // point : backtrace from left child or right child ?                // using right child and lastVisitedNode to distinguish                TreeNode *backtraceNode = s.top() ;                if(backtraceNode->right == nullptr)                {                    // backtrace from left and  [leaves]                    traversalRst.push_back(backtraceNode->val) ;                    lastVisitedNode = backtraceNode ;                    s.pop() ;                    // leave pos = nullptr , continue to backtrace                }                else if(backtraceNode->right == lastVisitedNode)                {                    // backtrace from right                    traversalRst.push_back(backtraceNode->val) ;                    lastVisitedNode = backtraceNode ;                    s.pop() ;                    // same with condition leaves ;                }                else                {                    // backtrace from left  and [not leaves]                    pos = backtraceNode->right ;                }            }        }        return traversalRst ;    }};

后记

代码有冗余,但是更符合上面的分析

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 机动车登记证丢了怎么办 b1驾照扣了9分怎么办 听力正常体检不过关怎么办 做完人流第二天同房了怎么办 医院的票据丢了怎么办 体检人体成分(脂肪缺乏)该怎么办 诊断出右下叶肺炎怎么办 做胸透穿钢圈内衣怎么办 预约不上留学体检怎么办 跨省离职后社保怎么办 开车到成都限号怎么办 月经量多怎么办吃什么 报驾校体检视力不达标怎么办 换驾驶证c1一只眼不合格怎么办 考驾照紧张腿抖怎么办 驾照该换了色弱怎么办 怀孕5个月感冒咳嗽怎么办 怀孕4个月喉咙痛怎么办 怀孕5个多月总是咳嗽尿失禁怎么办 怀孕7个月感冒了怎么办 怀孕7个月感冒喉咙痛怎么办 孕38周感冒咳嗽喉咙痛怎么办 嗓子痛咳嗽有痰怎么办 怀孕6个月了咳嗽怎么办 怀孕了咳嗽黄痰怎么办 科二5次没考过怎么办 交警开的罚单丢了怎么办 驾驶员从业资格证被水洗了怎么办 驾照考五次没过怎么办 学车每次考不过怎么办 年检超期3个月怎么办 年检超过3个月怎么办 工商执照年检时候忘记密码怎么办 个体工商营业执照年检过期怎么办 忘了审车时间怎么办 汽车年检超过时间了怎么办 星巴克金星会员到期怎么办 驾考学员证丢了怎么办 违章扣满12分怎么办 违章扣满12分后怎么办 东方时尚驾校科二考不过怎么办