leetcode 145. Binary Tree Postorder Traversal

传送门

145. Binary Tree Postorder Traversal

 
QuestionEditorial Solution
 My Submissions
  • Total Accepted: 106482
  • Total Submissions: 291244
  • Difficulty: Hard

 

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1\2/3

 

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

 

Subscribe to see which companies asked this question

Hide Tags
 Tree Stack
Show Similar Problems
题解转自:
http://blog.csdn.net/feliciafay/article/details/18341703
http://blog.csdn.net/sunao2002002/article/details/45925633

分析如下:

a)普通的做法

题目要求对二叉树进行非递归的后序遍历,所谓后序遍历即,先访问左子树、然后是右子树,最后访问根节点。通常采用递归的方法,题目要求采用非递归的方法实现。算法如下:

1)如果根节点非空,将根节点加入到栈中。

2)如果栈不空,取栈顶元素(暂时不弹出),

                             如果(左子树已访问过或者左子树为空),且(右子树已访问过或右子树为空),则弹出栈顶节点,将其值加入数组,

                            如果左子树不为空,切未访问过,则将左子节点加入栈中,并标左子树已访问过。

                            如果右子树不为空,切未访问过,则将右子节点加入栈中,并标右子树已访问过。

3)重复第二步,直到栈空。

b) 优雅的做法

这是二叉树的后序遍历,题目要求用非递归。之前的文章写过,依稀有些印象,这次自己写了写,还是没写成功。前序后序中序遍历都会用到栈这个结构,这也是由树这种数据结构的特点决定的。比较特殊的是,后序遍历的顺序是"左子树->右子树->根",它要求左子树和右子树都在根之前输出。根据这个特点,可以这样来进行,每次记录一个pre和cur,cur表示当前节点,pre表示上次输出的节点(是上次输出的节点,不是上次访问的节点),如果pre正好是cur的左子树或者右子树,那么就可以输出cur,否则,说明还有cur的左子树或者右子树等待输出,也就是还没到cur输出的时候。这是第一个可以让cur输出的条件。另外可以可以让cur输出的条件是,cur是叶子节。

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<int> postorderTraversal(TreeNode* root) {
13         vector<int> ans;
14         TreeNode* pre = root;
15         TreeNode* cur = NULL;
16         if(root == NULL) return ans;
17         stack<TreeNode*> s;
18         s.push(root);
19         while(s.size() >= 1) {
20             cur = s.top();
21             //如果cur是叶子节点,输出。或者如果pre正好是cur的左子树或者右子树,那么就可以输出cur,否则,说明还有cur的左子树或者右子树等待输出,也就是还没到cur输出的时候。
22             //printf(" size = %d cur = %d\n",s.size(),cur->val);
23             if( (cur->left == NULL && cur->right == NULL) || (pre == cur->left || pre == cur->right) ) {
24                 pre = cur;
25                 ans.push_back(cur->val);
26                 s.pop();
27             }
28             else{
29                 if(cur->right != NULL) {
30                     s.push(cur->right);
31                 }
32                 if(cur->left != NULL) {
33                     s.push(cur->left);
34                 }
35             }
36         }
37         return ans;
38     }
39 };

 

转载于:https://www.cnblogs.com/njczy2010/p/5742131.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

74-A/D指标,Accumulation/Distribution,积累/派发线,离散指标.(2015.7.1)

A/D指标&#xff0c;Accumulation/Distribution积累/派发线&#xff0c;离散指标观井映天2015.7.1转载于:https://www.cnblogs.com/i201102053/p/10626638.html

linux 密码修改下次,问题:如何强制用户在下次登录Linux时更改密码

当你使用默认密码创建用户时&#xff0c;你必须强制用户在下一次登录时更改密码。当你在一个组织中工作时&#xff0c;此选项是强制性的。因为老员工可能知道默认密码&#xff0c;他们可能会也可能不会尝试不当行为,看到下图会不会有为用户担心的感觉&#xff1a;使用 passwd 命…

tableau获取筛选器值_认识Tableau中的筛选器

Tableau中的筛选器&#xff1a;(1)提取筛选器(2)数据源筛选器(3)上下文筛选器(4)维度筛选器(5)度量筛选器(6)参数筛选器(7)表计算筛选器(8)页面筛选器对筛选器进行简单的分类&#xff1a;数据层(提取筛选器、数据源筛选器、上下文筛选器、参数筛选器)视图层(维度筛选器、度量筛…

类与对象的实例属性

class Chinese: countrychina def __init__(self,name): self.namename def playball(self,ball): print(%s正在打%s%(self.name,ball))name1input(>>>)#输入输出尽量别放函数里p1Chinese(name1)p1.playball(足球)print(p1.country)#china,类的…

svn的merge使用例子

先说说什么是branch。按照Subversion的说法&#xff0c;一个branch是某个development line&#xff08;通常是主线也即trunk&#xff09;的一个拷贝&#xff0c;见下图&#xff1a; branch存在的意义在于&#xff0c;在不干扰trunk的情况下&#xff0c;和trunk并行开发&#xf…

C# 课堂总结2-数据类型及转换方式

一、输入输出语句 Console.ReadLine(); 会等待直到用户按下回车&#xff0c;一次读入一行Console.ReadKey(); 则是等待用户按下任意键&#xff0c;一次读入一个字符。 二、数据类型 主要掌握&#xff1a; 1.值类型&#xff1a;int 整型&#xff0c;float 浮点型&#xff08;单精…

linux编译c gedit,[2018年最新整理]LINUX-Gedit文本编辑器.ppt

[2018年最新整理]LINUX-Gedit文本编辑器Gedit文本编辑器 系别&#xff1a;电信系 班级&#xff1a;08 自动化 姓名&#xff1a;张小亚 学号&#xff1a; 30 号 辅导老师&#xff1a;兰建平 Gedit的启动与打开文本 Gedit可以用命令或主菜单的方式两种方式启动。打开文件可以在终…

jsx怎么往js里传参数_在vue中使用jsx语法的使用方法

什么是JSX?JSX就是Javascript和XML结合的一种格式。React发明了JSX&#xff0c;利用HTML语法来创建虚拟DOM。当遇到我为什么要在vue中用JSX?想折腾一下呗,开玩笑.最开始是因为近期在学习react,在里面体验了一把jsx语法,发现也并没有别人说的很难受的感觉啊,于是就想尝试在vue…

如何对数据库中的表以及表中的字段进行重命名

貌似没有直接的SQL语句可以做到这一点&#xff0c;除非删除再加。。。 SQL SERVER 中提供了存储过程&#xff1a;SP_RENAME 对表进行重命名&#xff1a; 更多详见&#xff1a;https://msdn.microsoft.com/zh-cn/library/ms188351.aspx转载于:https://www.cnblogs.com/xwgli/p/4…

系统优化-----sysctl.conf文件内核设置参数详解

摘自https://blog.csdn.net/tallercc/article/details/52823075 sysctl.conf工作原理 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/IP堆栈和虚拟内存系统的高级选项&#xff0c; 这可以让有经验的管理员…

How Tomcat works — 一、怎样阅读源码

在编程的道路上&#xff0c;通过阅读优秀的代码来提升自己是很好的办法。一直想阅读一些开源项目&#xff0c;可是没有合适的机会开始。最近做项目的时候用到了shiro&#xff0c;需要做集群的session共享&#xff0c;经过查找发现tomcat的session本身就支持&#xff0c;发现自己…

linux c字符连接,C 语言实例

指针方法&#xff1a;#include int main(){char str1[100], str2[100], *p str1,n 0;printf("请输入第一个字符串:");scanf("%s", str1);printf("请输入第二个字符串:");scanf("%s", str2);while (*p ! \0);/*移动指针到str1尾*/--p…

plot画分段函数_python画图函数大全

很多时候&#xff0c;我们需要用python画图&#xff0c;这样就可以更加直观的看到数据的走势&#xff0c;而不是干巴巴的数字。今天&#xff0c;我们就给大家整理了一下python画图的常用函数&#xff0c;由于篇幅限制。无法将这些函数的使用方法全部表现出来。所以&#xff0c;…

BZOJ 2145 悄悄话

悄悄话 写的筋疲力尽&#xff0c;从下午8点开始写&#xff0c;现在已经一点半了。 主要就是一个暴力&#xff0c;然后加上算权值。用单词词频来搞。 但是第10个测试点 Madam, Im Adam.出事了&#xff0c;因为我有符号还是会把单词分开&#xff0c;然后无法识别Im 最后强行面向数…

第9章 使用ssh服务管理远程主机。

章节简述&#xff1a; 学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态。 完整演示sshd服务配置方法并详细讲述每个参数的作用&#xff0c;实战基于密钥远程登陆实验以及用screen服务让远程会话不再终断。 本…

enum不能被继承

1、枚举类介绍 如果一个类的实例是有限且确定的&#xff0c;那么可以使用枚举类。比如&#xff1a;季节类&#xff0c;只有春夏秋冬四个实例。 枚举类使用enum进行创建&#xff0c;其实例必须从”第一行“开始显示写出。 enum Season{SPRING,SUMMER,FALL,WINTER;//默认public s…

linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由

问题/发现&#xff1a;本人在为一款路由器写一个统计局域网互传流量的Linux内核模块的时候&#xff0c;发现如下问题&#xff1a;局域网内的一台设备和该局域网内另一台设备进行通信时&#xff0c;我在路由器的netfilter链表处设下钩子&#xff0c;以捕获数据。后来发现这些数据…

kali linux 升级命令_作为高级Java,你应该了解的Linux知识

原创&#xff1a;小姐姐味道(微信公众号ID&#xff1a;xjjdog)&#xff0c;欢迎分享&#xff0c;转载请保留出处。作为一个javaer&#xff0c;我以前写过很多关于Linux的文章。但经过多年的观察&#xff0c;发现其实对于大部分人&#xff0c;有些东西压根就用不着。用的最多的&…

arn linux编译系统时错误的解决

今天打算编译支持orange pi开发板的Raspbain Jessie系统 从github上拿下源码,下载,编译,一直比较顺利 结果在编译一半的时候报错: /second-stage: line 206: /bin/sleep: cannot execute binary file: Exec format error 根据错误提示信息,找到了该语句如下: while kill -0 $1 …

【进出理论】投入与收益

笔者对网游相当无感&#xff0c;再加上以前玩过不少游戏。对现在的游戏没有多大的吸引力&#xff0c;倒是对爱情有所感性&#xff0c;及当代IT技术的发展。许多以前无法获取的东西&#xff0c;现在在网络寻找各种方式&#xff0c;或者若干想通了什么&#xff0c;就总可以获取到…