-
题目描述
给定一个二叉树的根节点 root
,返回它的 中序遍历 结果。中序遍历 的顺序是:左子树 -> 根节点 -> 右子树。
示例
输入: root = [1,null,2,3] 输出: [1,3,2]
-
解题思路
中序遍历是二叉树遍历的一种经典方式,通常可以通过 递归 或 迭代 实现。
方法 1:递归
递归是最直观的实现方式。
步骤
- 递归遍历左子树。
- 访问根节点。
- 递归遍历右子树。
代码实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
var result []int
var inorder func(node *TreeNode)
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left) // 遍历左子树
result = append(result, node.Val) // 访问根节点
inorder(node.Right) // 遍历右子树
}
inorder(root)
return result
}
方法 2:迭代(使用栈)
递归的本质是栈,因此可以通过显式使用栈来模拟递归过程。
步骤
- 从根节点开始,将所有左子节点入栈。
- 弹出栈顶节点,访问该节点。
- 将当前节点指向其右子节点,重复步骤 1。
代码实现
func inorderTraversal(root *TreeNode) []int {
var result []int
stack := []*TreeNode{}
curr := root
for curr != nil || len(stack) > 0 {
// 将所有左子节点入栈
for curr != nil {
stack = append(stack, curr)
curr = curr.Left
}
// 弹出栈顶节点并访问
curr = stack[len(stack)-1]
stack = stack[:len(stack)-1]
result = append(result, curr.Val)
// 转向右子树
curr = curr.Right
}
return result
}
-
类似题目
1. 二叉树的前序遍历(LeetCode 144)
- 题目描述:给定一个二叉树的根节点
root
,返回它的 前序遍历 结果。 - 解题思路:前序遍历的顺序是:根节点 -> 左子树 -> 右子树。可以使用递归或迭代实现。
2. 二叉树的后序遍历(LeetCode 145)
- 题目描述:给定一个二叉树的根节点
root
,返回它的 后序遍历 结果。 - 解题思路:后序遍历的顺序是:左子树 -> 右子树 -> 根节点。可以使用递归或迭代实现。
3. 二叉树的层序遍历(LeetCode 102)
- 题目描述:给定一个二叉树的根节点
root
,返回它的 层序遍历 结果。 - 解题思路:使用队列实现广度优先搜索(BFS)。
4. 验证二叉搜索树(LeetCode 98)
- 题目描述:给定一个二叉树的根节点
root
,判断它是否是一个有效的二叉搜索树。 - 解题思路:中序遍历二叉搜索树的结果是一个递增序列,可以利用这一性质进行验证。
5. 二叉搜索树中的搜索(LeetCode 700)
- 题目描述:给定一个二叉搜索树的根节点
root
和一个值val
,找到节点值等于val
的节点。 - 解题思路:利用二叉搜索树的性质进行搜索。
-
总结
- 中序遍历 是二叉树遍历的基础,掌握递归和迭代的实现方式非常重要。
- 类似题目包括前序遍历、后序遍历、层序遍历等,都是二叉树遍历的变种。