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;
}
}
热门推荐
树的广度优先遍历和深度优先遍历详解
员工卫生及健康管理制度的法律要点解析
腰椎锻炼方法是什么
DIY香水调制:揭秘香精浓度的诀窍与操作指南
被美揍后,才想起中国的好!面对特朗普加税,加教授称出路在东方
AI预测汽车涂装的未来:纳米涂层技术带自清洁功能
“挑战者”号:仓促发射的悲剧
降眼压药物大盘点:五类主要药物的作用机制与使用注意事项
酸碱作业防护装备全攻略:从选择到使用注意事项
人工智能最新动态研究,热点新闻综述-人工智能最新研究成果
一周科技:哈佛研究揭秘最佳进食时间,锂电池回收获新突破
Excel中如何随机生成一段数字且总和等于特定值
什么是国债逆回购,有无风险
退役军人乘机优待升级!多地机场推出专属绿色通道
丘疹与荨麻疹的区别
煮中药的最佳时间:中药煮多久效果最好
贵阳花果园双子塔:中国西部崛起的新地标
成都省钱又环保:喷砂沙子回收的优势
冷冬香煎杏仁鳕年鱼
潇湘八景指的是哪八景
怀孕期间需要替换的物品清单及安全替代方案
玫瑰苹果热红茶
如何撰写东方玄幻小说
团队计件奖金包分配的三大黄金法则:如何用数据驱动实现公平与效率
掌握“degrees”的正确发音与多重用法,提升英语表达能力
win10系统任务管理器怎么最小化
掌握5个关键点,搞定语音识别测试!
热点思考:税收增速为何跑输GDP?——“大国财政”系列之一
丢失财物报警立案标准
期权的定价依据是什么?这种定价方式有哪些优缺点?