3707 字
约 12 分钟
11
094.二叉树的中序遍历
无标签

094.二叉树的中序遍历

作者:沉默王二
发布时间:2023-10-29T15:29:20.266+0800


本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

难度

简单

示例

示例 1:

输入:root=[1,null,2,3]

示例 2:

输入:root=[]

示例 3:

输入:root=[1]

分析

对于这道题,我们需要先搞清楚,什么是二叉树的中序遍历。

前序遍历、中序遍历、后序遍历是二叉树的三种基本遍历方式,它们的主要区别在于访问根节点的时间。

  • 前序遍历 (Preorder Traversal)
  • 先访问根节点
  • 接着访问左子树
  • 最后访问右子树
  • 遍历顺序:根 -> 左 -> 右
  • 中序遍历 (Inorder Traversal)
  • 先访问左子树
  • 接着访问根节点
  • 最后访问右子树
  • 遍历顺序:左 -> 根 -> 右
  • 后序遍历 (Postorder Traversal)
  • 先访问左子树
  • 接着访问右子树
  • 最后访问根节点
  • 遍历顺序:左 -> 右 -> 根

这里是一个简单的二叉树示意图:

A

BC//\DEFG

对于这个二叉树:

  • 前序遍历的结果是:A, B, D, E, C, F, G
  • 中序遍历的结果是:D, B, E, A, F, C, G
  • 后序遍历的结果是:D, E, B, F, G, C, A

我们可以写出一个中序遍历大概的算法雏形

publicvoidtraversal(TreeNodenode){

traversal(node.left);}read(node);if(node.right!=null){traversal(node.right);}}

同理我们稍微变换一下也可以得到对应的前序和后序遍历的算法

publicvoidtraversal(TreeNodenode){

if(node.left!=null){traversal(node.left);}if(node.right!=null){traversal(node.right);}}

publicvoidtraversal(TreeNodenode){

traversal(node.left);}if(node.right!=null){traversal(node.right);}read(node);}

最后我们只需要稍微对边界条件进行限制即可得到最终的算法。

/**

*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,TreeNoderight){this.val=val;this.left=left;this.right=right;}}/classSolution{//创建一个列表,用于存放中序遍历的结果Listres=newArrayList<>();//主方法,开始中序遍历publicListinorderTraversal(TreeNoderoot){//如果树不为空,则开始遍历if(root!=null){traversal(root);}//返回中序遍历的结果returnres;}
//读取当前节点的值,并将其添加到结果列表中publicvoidread(TreeNodenode){res.add(node.val);}
//中序遍历的核心逻辑publicvoidtraversal(TreeNodenode){//如果当前节点的左子树不为空,先遍历左子树if(node.left!=null){traversal(node.left);}//访问当前节点read(node);//如果当前节点的右子树不为空,接着遍历右子树if(node.right!=null){traversal(node.right);}}}

当输入为 1,null,2,3,二叉树可以表示为以下结构:

1

2/3

我们来模拟一下题解中的中序遍历过程。

  • 初始调用:从根节点1开始调用inorderTraversal。
  • 在inorderTraversal中,检查根节点1是否为null。既然不是,继续调用traversal。
  • 在traversal中:
  • 先检查节点1的左子树是否存在。但节点1的左子树是null,所以不做进一步递归。
  • 然后,调用read方法访问节点1并将值1添加到结果列表res中。
  • 接着,它会遍历节点1的右子树,即节点2。
  • 为节点2重复步骤3:
  • 先检查节点2的左子树。这里,节点2有一个左子节点3,所以它递归调用traversal为节点3。
  • 对于节点3,它没有左子树,所以它直接访问该节点,并将值3添加到结果列表res中。
  • 节点3没有右子树,所以没有进一步的递归调用。
  • 回到节点2,在访问了它的左子树后,现在访问节点2本身,并将值2添加到结果列表res中。
  • 节点2没有右子树,所以此处的遍历结束。
  • 在完成以上所有步骤后,遍历完成。

根据以上描述,结果列表res为:[1, 3, 2]。

来看一下题解效率:

总结

递归处理是处理树形结构中最常用的一个操作,因为树的结构本质与递归殊途同归,在逻辑结构上二者十分近似,所以在学习树结构时,我们通常都可以类比递归,并从中获得启发。

力扣链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

难度

简单

示例

示例 1:

输入:root=[1,null,2,3]

示例 2:

输入:root=[]

示例 3:

输入:root=[1]

分析

对于这道题,我们需要先搞清楚,什么是二叉树的中序遍历。

前序遍历、中序遍历、后序遍历是二叉树的三种基本遍历方式,它们的主要区别在于访问根节点的时间。

  • 前序遍历 (Preorder Traversal)
  • 先访问根节点
  • 接着访问左子树
  • 最后访问右子树
  • 遍历顺序:根 -> 左 -> 右
  • 中序遍历 (Inorder Traversal)
  • 先访问左子树
  • 接着访问根节点
  • 最后访问右子树
  • 遍历顺序:左 -> 根 -> 右
  • 后序遍历 (Postorder Traversal)
  • 先访问左子树
  • 接着访问右子树
  • 最后访问根节点
  • 遍历顺序:左 -> 右 -> 根

这里是一个简单的二叉树示意图:

A

BC//\DEFG

对于这个二叉树:

  • 前序遍历的结果是:A, B, D, E, C, F, G
  • 中序遍历的结果是:D, B, E, A, F, C, G
  • 后序遍历的结果是:D, E, B, F, G, C, A

我们可以写出一个中序遍历大概的算法雏形

publicvoidtraversal(TreeNodenode){

traversal(node.left);}read(node);if(node.right!=null){traversal(node.right);}}

同理我们稍微变换一下也可以得到对应的前序和后序遍历的算法

publicvoidtraversal(TreeNodenode){

if(node.left!=null){traversal(node.left);}if(node.right!=null){traversal(node.right);}}

publicvoidtraversal(TreeNodenode){

traversal(node.left);}if(node.right!=null){traversal(node.right);}read(node);}

最后我们只需要稍微对边界条件进行限制即可得到最终的算法。

/**

*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,TreeNoderight){this.val=val;this.left=left;this.right=right;}}/classSolution{//创建一个列表,用于存放中序遍历的结果Listres=newArrayList<>();//主方法,开始中序遍历publicListinorderTraversal(TreeNoderoot){//如果树不为空,则开始遍历if(root!=null){traversal(root);}//返回中序遍历的结果returnres;}
//读取当前节点的值,并将其添加到结果列表中publicvoidread(TreeNodenode){res.add(node.val);}
//中序遍历的核心逻辑publicvoidtraversal(TreeNodenode){//如果当前节点的左子树不为空,先遍历左子树if(node.left!=null){traversal(node.left);}//访问当前节点read(node);//如果当前节点的右子树不为空,接着遍历右子树if(node.right!=null){traversal(node.right);}}}

当输入为 1,null,2,3,二叉树可以表示为以下结构:

1

2/3

我们来模拟一下题解中的中序遍历过程。

  • 初始调用:从根节点1开始调用inorderTraversal。
  • 在inorderTraversal中,检查根节点1是否为null。既然不是,继续调用traversal。
  • 在traversal中:
  • 先检查节点1的左子树是否存在。但节点1的左子树是null,所以不做进一步递归。
  • 然后,调用read方法访问节点1并将值1添加到结果列表res中。
  • 接着,它会遍历节点1的右子树,即节点2。
  • 为节点2重复步骤3:
  • 先检查节点2的左子树。这里,节点2有一个左子节点3,所以它递归调用traversal为节点3。
  • 对于节点3,它没有左子树,所以它直接访问该节点,并将值3添加到结果列表res中。
  • 节点3没有右子树,所以没有进一步的递归调用。
  • 回到节点2,在访问了它的左子树后,现在访问节点2本身,并将值2添加到结果列表res中。
  • 节点2没有右子树,所以此处的遍历结束。
  • 在完成以上所有步骤后,遍历完成。

根据以上描述,结果列表res为:[1, 3, 2]。

来看一下题解效率:

总结

递归处理是处理树形结构中最常用的一个操作,因为树的结构本质与递归殊途同归,在逻辑结构上二者十分近似,所以在学习树结构时,我们通常都可以类比递归,并从中获得启发。

力扣链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

难度

简单

示例

示例 1:

输入:root=[1,null,2,3]

示例 2:

输入:root=[]

示例 3:

输入:root=[1]

分析

对于这道题,我们需要先搞清楚,什么是二叉树的中序遍历。

前序遍历、中序遍历、后序遍历是二叉树的三种基本遍历方式,它们的主要区别在于访问根节点的时间。

  • 前序遍历 (Preorder Traversal)
  • 先访问根节点
  • 接着访问左子树
  • 最后访问右子树
  • 遍历顺序:根 -> 左 -> 右
  • 中序遍历 (Inorder Traversal)
  • 先访问左子树
  • 接着访问根节点
  • 最后访问右子树
  • 遍历顺序:左 -> 根 -> 右
  • 后序遍历 (Postorder Traversal)
  • 先访问左子树
  • 接着访问右子树
  • 最后访问根节点
  • 遍历顺序:左 -> 右 -> 根

这里是一个简单的二叉树示意图:

A

BC//\DEFG

对于这个二叉树:

  • 前序遍历的结果是:A, B, D, E, C, F, G
  • 中序遍历的结果是:D, B, E, A, F, C, G
  • 后序遍历的结果是:D, E, B, F, G, C, A

我们可以写出一个中序遍历大概的算法雏形

publicvoidtraversal(TreeNodenode){

traversal(node.left);}read(node);if(node.right!=null){traversal(node.right);}}

同理我们稍微变换一下也可以得到对应的前序和后序遍历的算法

publicvoidtraversal(TreeNodenode){

if(node.left!=null){traversal(node.left);}if(node.right!=null){traversal(node.right);}}

publicvoidtraversal(TreeNodenode){

traversal(node.left);}if(node.right!=null){traversal(node.right);}read(node);}

最后我们只需要稍微对边界条件进行限制即可得到最终的算法。

/**

*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,TreeNoderight){this.val=val;this.left=left;this.right=right;}}/classSolution{//创建一个列表,用于存放中序遍历的结果Listres=newArrayList<>();//主方法,开始中序遍历publicListinorderTraversal(TreeNoderoot){//如果树不为空,则开始遍历if(root!=null){traversal(root);}//返回中序遍历的结果returnres;}
//读取当前节点的值,并将其添加到结果列表中publicvoidread(TreeNodenode){res.add(node.val);}
//中序遍历的核心逻辑publicvoidtraversal(TreeNodenode){//如果当前节点的左子树不为空,先遍历左子树if(node.left!=null){traversal(node.left);}//访问当前节点read(node);//如果当前节点的右子树不为空,接着遍历右子树if(node.right!=null){traversal(node.right);}}}

当输入为 1,null,2,3,二叉树可以表示为以下结构:

1

2/3

我们来模拟一下题解中的中序遍历过程。

  • 初始调用:从根节点1开始调用inorderTraversal。
  • 在inorderTraversal中,检查根节点1是否为null。既然不是,继续调用traversal。
  • 在traversal中:
  • 先检查节点1的左子树是否存在。但节点1的左子树是null,所以不做进一步递归。
  • 然后,调用read方法访问节点1并将值1添加到结果列表res中。
  • 接着,它会遍历节点1的右子树,即节点2。
  • 为节点2重复步骤3:
  • 先检查节点2的左子树。这里,节点2有一个左子节点3,所以它递归调用traversal为节点3。
  • 对于节点3,它没有左子树,所以它直接访问该节点,并将值3添加到结果列表res中。
  • 节点3没有右子树,所以没有进一步的递归调用。
  • 回到节点2,在访问了它的左子树后,现在访问节点2本身,并将值2添加到结果列表res中。
  • 节点2没有右子树,所以此处的遍历结束。
  • 在完成以上所有步骤后,遍历完成。

根据以上描述,结果列表res为:[1, 3, 2]。

来看一下题解效率:

总结

递归处理是处理树形结构中最常用的一个操作,因为树的结构本质与递归殊途同归,在逻辑结构上二者十分近似,所以在学习树结构时,我们通常都可以类比递归,并从中获得启发。

力扣链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
094.二叉树的中序遍历
https://clxhxhhr.top/posts/2548/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。