LeetCode94:二叉树的中序遍历(非递归实现)
创作时间:
作者:
@小白创作中心
LeetCode94:二叉树的中序遍历(非递归实现)
引用
CSDN
1.
https://m.blog.csdn.net/Zhangjiangyan711/article/details/145064152
题目描述
给定一个二叉树的根节点root,返回它的中序遍历。
解题思路
要实现二叉树的非递归中序遍历,必须要借助栈。整个操作可以看成是很多个只有左子树的单边树,从头结点开始一直向左下方走,将经过的结点依次入栈,直至没有左孩子了,弹出结点,同时指向当前结点的右孩子,那么右子树同样可以看成是以这个右孩子为头结点的多个单边树,重复上面的操作即可。
以下图的中序遍历为例,1、2、3结点依次入栈,结点3无左孩子,3弹出,指向右孩子4,4入栈,无左孩子,4弹出,4无右孩子,2弹出,2无右孩子,1弹出,指向右孩子5,5、6依次入栈,6无左孩子,6弹出,6无右孩子,5弹出,指向右孩子7,7无左孩子,7弹出,7无右孩子,此时栈空,无法继续弹出栈顶元素,遍历结束。
具体迭代步骤如下:
- 空树无法遍历,直接返回空数组
- 在非空二叉树中,首先将头结点压栈,再使
root=root.left,将该结点的左孩子压栈,重复该操作(即:将二叉树的左边界依次压入栈中) - 判断当前结点是否为空(也就是步骤2最后一次执行压栈操作前指向的结点的左孩子是否存在),若为空,弹出栈顶元素(当前结点的父结点)并加入到数组中,同时让
root=root.right,重复步骤2 - 当所有结点全都出栈且当前结点也为空时,遍历不再继续,结束
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if(root == null) return list;
else {
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty() || root != null) {
if(root != null) {
stack.push(root);
root = root.left;
}else {
root = stack.pop();
list.add(root.val);
root = root.right;
}
}
}
return list;
}
}
热门推荐
美国学者揭秘:上一轮加税后,美国消费者和企业都经历了什么?
同样是弑父,中国的哪吒与经典希腊悲剧有什么不同?
主机电脑内存的工作原理是什么?
蒸馒头,冷水热水区别很大,牢记3个诀窍,又白又软,蓬松不塌陷
公务员省考面试全流程解析:从准备到应对策略
个人房产转让如何公证?这些法律问题一次性说清
房产证过户需要哪些材料,应该如何处理
二手物品进口,海关查验的关键环节与注意事项
智能汽车充电设施建设加速,推动电动汽车市场普及
如何选择基金公司进行投资?这类公司的选择标准是什么?
如何有效设计接口测试用例?探索最佳思路与方法
神经性呕吐是什么病引起的
科普|金秋时节如何应对支气管炎?
项目管理目标分析法有哪些
验证方法有哪些?这些验证方法有什么实际用途?
如何选择合适的地板胶带?这类地板胶带的使用方法有哪些?
软件如何测试是不是快充
词源趣谈 | default到底是哪种fault(过错)?
酚酞指示剂变色范围是什么(《50 种化学指示剂与指示液的配置方法及显色范围》)
拘留所里的犯人称为什么:法律术语与实践解析
告别寒冰困扰:快速除冰秘籍大公开
美国投资建厂的全面指南
加班文化对职场健康的影响与应对策略
FAE工作内容是什么?
医保个人账户如何全家共享?这份官方指南请收好
高空作业安全防护措施有哪些?
Word如何排版选择题选项
梦境解析:探索“父亲去世”梦境的深层含义
歌圩传法韵 壮乡展新风 广西依托民族传统节日搭建法治宣传舞台
交钱还是捡钱?年终奖计税方式这样选