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;
}
}
热门推荐
板栗南瓜豆浆:秋季养生饮品制作指南
全球最大漂浮式“孖生风机”在阳江并网发电
如何查询环评指标数据库
高效备考技巧 | 成功通过雅思考试的方法
当年,马桥豆腐干凭这道菜一举成名丨乃清叙史
艾滋病人能否食用木棉花?深入了解其效用与注意事项
木棉花的毒性与危害是什么
车牌号880的寓意:财富与顺利的象征
如何正确测量下肢血压?
火风鼎卦:《易经》中的变革与鼎盛
银行的信用卡年费减免条件的优化建议分析
七大类高含金量证书,大学生可以准备起来
常见保湿成分合集 挑选护肤品不走弯路
微信视频号运营指南:如何避免因违规内容被封?
揭秘商业世界的心理游戏!如何用情绪价值俘获消费者的心?
亚洲蹲能减肥吗?亚洲蹲的燃脂效果、技巧及注意事项全解析
女人喝豆浆的好处:早晨喝豆浆9大好处7禁忌
断头河变身鱼翔浅底的“水下森林”!海湾旅游区水环境升级“生态大鱼缸”
雾视镜是什么眼镜?作用是什么?
502错误发生时,nginx和php-fpm经历了怎样的过程
打造完美音乐空间:揭秘如何构建高效隔音的KTV隔音房?
如何解读血常规化验单
过期的面包能吃吗
安善桥:岁月沉淀下的水乡诗篇 🌉
掌握投资七大定律,实现财富自由之路
环保材料包装:绿色未来的必然选择
苹果电脑函数怎么用
蚂蚁HR浅析2025年招聘市场新趋势:从“抢人”大战看未来走向
男人腰疼的10大征兆
顾客出现纠纷如何处理:法律实务中的应对策略与操作指南