二叉树的后序非递归遍历(巧妙思想...)
来源:互联网 发布:ubuntu 17配置lamp 编辑:程序博客网 时间:2024/05/21 17:24
大家都知道二叉树的前序非递归遍历非常好写:
//二叉树的结构public class TreeNode { TreeNode left; TreeNode right; int val; TreeNode(int val) { this.val = val; left = right = null; }}
首先判断根是否为空,将根节点入栈
1.若栈为空,则退出循环
2.将栈顶元素弹出,访问弹出的节点
3.若弹出的节点的右孩子不为空则将右孩子入栈
4.若弹出的节点的左孩子不为空则将左孩子入栈
5.返回1
void preOrder(){ Stack<TreeNode> stack = new Stack<TreeNode>(); if (root != null) { stack.push(root); while (!stack.isEmpty()) { root = stack.pop(); visit(root); if (root.right != null) { stack.push(root.right); } if (root.left != null) { stack.push(root.left); } } }}
而二叉树的后序非递归遍历就比较难写,因为涉及到判断节点的访问状态…
现在有个很巧妙的方法:
前序:根->左->右
后序:左->右->根
那么可以把后序当作:根->右->左,然后再反转一下即可。
ArrayList<Integer> postOrder(TreeNode root) { ArrayList<Integer> list = new ArrayList<Integer>(); if (root != null) { Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.pop(); list.add(node.val); if (node.left != null) { stack.push(node.left); } if (node.right != null) { stack.push(node.right); } } //反转 Collections.reverse(list); } return list;}
阅读全文
0 0
- 二叉树的后序非递归遍历(巧妙思想...)
- 二叉树的非递归遍历思想
- 项目二——二叉树遍历的递归思想
- 二叉树的遍历(递归遍历)
- leetcode之二叉树遍历求和巧妙递归
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树遍历的应用(递归!递归!递归!)
- 二叉树的后序非递归遍历(双栈法)
- 二叉树的后序非递归遍历
- 二叉树遍历(思想)
- 二叉树的遍历(非递归)
- 二叉树的遍历(递归方法)
- 二叉树的遍历(非递归)
- 二叉树的遍历(非递归)
- 二叉树的遍历(递归)
- 二叉树的遍历(递归加迭代)
- 二叉树的递归遍历(dp)
- 二叉树的遍历(递归)
- 多态
- HTML中      等6种空白空格的区别
- Oracle根据身份证号码判断性别,年龄
- 浅谈数据挖掘与机器学习
- 自动化程序
- 二叉树的后序非递归遍历(巧妙思想...)
- 通天源码论坛网狐游戏平台游戏编译常见错误
- Composer PHP依赖管理的新时代
- hadoop Configuration
- HTML学习笔记(三)——HTML样式
- 树形DP HDU 5416
- android monkey压力测试
- git commit 模板配置
- 一篇文章搞定矩阵相关概念及意义--通俗解释汇总