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;
}
}
热门推荐
经典志怪故事,东方奇幻世界!
画梅兰竹菊,把握这四大特性
奇门遁甲的排盘及应用,什么是奇门九遁?
奇门遁甲之八神深度解析
“关税围墙”之下 中国汽车出口如何破局
5大英语单词记忆法,轻松记单词!
1~40周胎儿头围标准数值表(2025年最新版)
眼睛复视和散光的区别
养七彩鱼苗需要哪种鱼缸?如何选择合适的鱼缸?
客厅里鱼缸摆放位置 讲究和禁忌事项
办公软件怎么打出大于号
乌干达 追寻银背大猩猩 四日
中医调理耳聋:理论基础、治疗方法与临床实践
孩子不听话还对着干怎么办?这份科学育儿指南请收好
中药材干燥技术:传统与现代方法详解
胶质瘤CpG岛甲基化表型(G-CIMP):生物学和临床意义
外切眼袋的疤痕多久能看不出来?形成及改善过程+促进修复的妙招一文奉上
没有产权证能签定金合同吗?
AI新奇应用案例与及其对房地产行业的影响
不用药也能稳血糖?7个日常小习惯,让血糖不再“飙高”
李子柒,凭什么春晚第一个镜头给了她?揭秘背后真相!
徐建融:从《礼记》看“师严”与“道尊”
2025年中国玉米深加工行业区域格局分析:聚焦区域特色与资源优势【组图】
社区安全生产目标责任书范本
开源软件的盈利模式有哪些
汉中交警进企业、进校园、进农村开展交通安全宣传活动
5大因素,把肾病推向尿毒症
潇洒男孩网名大全最新 60个
英文冷笑话:让你笑到停不下来的幽默集锦
调制乳真的影响健康吗?