二叉树的非递归遍历
来源:互联网 发布:和玛丽苏开玩笑 知乎 编辑:程序博客网 时间:2024/06/10 05:10
先写下这个问题的模式
def preorderTraversal(self, root):if root == None: return []re = []insert root to stack swhile s not empty:cur_root = top of stack ss.pop()how to handle cur_roothow to handle cur_root.lefthow to handle cur_root.right
首先我们要把非空的root节点入栈,在循环里不断的判断出栈,然后处理栈顶元素及左孩子结点和右孩子结点。我们先看下当前的栈顶元素怎么处理,先根遍历的顺序是:【根 左 右】,而我们每次处理的栈顶元素的身份其实都恰好是根,所以我们就可以直接把这个根几点输出或放入结果容器中;那么其左孩子和右孩子如何处理呢?既然是模拟递归,那么肯定要入栈进行保存的,谁先入栈呢?考虑到栈的性质,我们应该让其右孩子先入栈,左孩子后入栈,这样,栈顶就是左孩子,下次先出栈的就是左孩子,这样就符合先根遍历的顺序了。
再回过头来看下在左右孩子没入栈之前,我们仅仅是获得了栈顶元素,该元素还依然在栈中,那么它在栈中还有意义吗?很明显没有意义了,因为它的信息我们已经输出,而其左右孩子在入栈后就再也不需要它了,所以就应该在左右孩子入栈前将其pop掉。
def preorderIter(self, root):if None == root: return []re = []; s = []s.append(root)while len(s):cur_root = s.pop()print cur_root.valre.append(cur_root.val)if cur_root.right:s.append(cur_root.right)if cur_root.left:s.append(cur_root.left)return re
同样,后根遍历也是如此,虽然后根的遍历是【左 右 根】,但是我们毕竟是知道根要放在哪里,区别就是子节点的入栈顺序的变化。
def postorderIter(self, root):if None == root:returnre = [] # store resultss = [] # node stacks.append(root)while len(s):cur_root = s.pop()re.insert(0,cur_root.val)if cur_root.left:s.append(cur_root.left)if cur_root.right:s.append(cur_root.right)return re
麻烦点的应该是中根遍历【左 根 右】,如前所述,我们处理的当前栈顶节点是视为根结点的,但是这个根结点却不知该放在结果中的哪里,放在前面,前面应该是左的位置,放在右面,右边应该是右孩子的位置,放中间?哪里算中间?1-10, 2 是中间还是3是中间?我们不确定,因为左右孩子的个数我们无从得知。
看来此时的栈顶元素不能像先根和后根那样,直接输出,还得在栈里面挤一下才好,不然总不能直接丢弃。
之所以当前的栈顶根不能输出,是因为它的左还没有确定,那么我们只要把它的左都输出了,就可以确定当前根的位置了。
def inorderIter(self, root):if None == root: return []re = []s = []s.append(root)while len(s):cur_root = s[-1]# push, until the last letfwhile cur_root.left:s.append(cur_root.left)cur_root = cur_root.left# pop, until one node has rightwhile len(s):cur_root = s[-1]print cur_root.valre.append(cur_root.val)s.pop()if cur_root.right:s.append(cur_root.right)breakreturn re
0 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- so的函数重名和重载
- 基于Android的低功耗移动心电监控系统的设计方案
- OpenCv Mat 对象应用到MFC
- 热天dry饿死认同公司提供
- 【Leetcode】3Sum Closest
- 二叉树的非递归遍历
- 安税负执制冈慰炕檀琅八纱既赐及
- 预防有的的人体工学
- Java中动态数组的实现
- 7.14老师需要的修改 关于多路径相关性
- hdu1003 动态规划的入门题
- 文件夹变扩展名
- 3-4. 成绩转换(15)
- POJ2392 Space Elevator 动态规划