LeetCode热题100—学习心得012
二叉树——二叉树的中序遍历
题目如下:
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点数目在范围
[
0
,
100
]
[0, 100]
[0,100]内
−
100
<
=
N
o
d
e
.
v
a
l
<
=
100
-100 <= Node.val <= 100
−100<=Node.val<=100
思路分析
完成这道题前我带大家先简单了解一下二叉树的结构和遍历方法。
从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。
二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。
层序遍历(level-order traversal)从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点,它体现了一种“一圈一圈向外扩展”的逐层遍历方式。层序遍历本质上属于广度优先遍历(breadth-first traversal),也称广度优先搜索(breadth-first search, BFS)。
前序、中序和后序遍历都属于深度优先遍历(depth-first traversal),也称深度优先搜索(depth-first search, DFS),它体现了一种“先走到尽头,再回溯继续”的遍历方式。
本题要求返回二叉树的中序遍历节点序列,直接使用中序遍历的方法即可。
代码解析
由于题目提示树中节点可能为0,所以需要对二叉树的节点进行合法性判断。中序遍历节点的顺序为左–根–右,即左子节点在前,根节点在中,右子节点在后。定义一个list列表用于存放节点的值,调用中序遍历方法,当传入节点不为空时,方法内需要使用传入节点的左子节点和右子节点递归调用自身,并将当前节点的值加入到list列表中。
三行代码在前序、中序和后序遍历中都是固定的,区别在于顺序不同。
若为前序,则先将根节点的值存入列表;
若为中序,则先调用函数并传入其左子节点作为参数,再将节点的值存入列表;
若为后序,则先调用函数并传入其左子节点作为参数,再调用函数并传入其右子节点作为参数,最后将节点的值存入列表;
代码解答
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
inorder(root, list);
return list;
}
public void inorder(TreeNode root, List<Integer> list) {
if(root != null) {
inorder(root.left, list);
list.add(root.val);
inorder(root.right, list);
}
}
}