LeetCode 94:二叉树的中序遍历

50 阅读3分钟
  1. 题目描述

给定一个二叉树的根节点 root,返回它的 中序遍历 结果。中序遍历 的顺序是:左子树 -> 根节点 -> 右子树。

示例

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

  1. 解题思路

中序遍历是二叉树遍历的一种经典方式,通常可以通过 递归迭代 实现。


方法 1:递归

递归是最直观的实现方式。

步骤
  1. 递归遍历左子树。
  2. 访问根节点。
  3. 递归遍历右子树。
代码实现
/**
 * 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. 从根节点开始,将所有左子节点入栈。
  2. 弹出栈顶节点,访问该节点。
  3. 将当前节点指向其右子节点,重复步骤 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. 类似题目

1. 二叉树的前序遍历(LeetCode 144)
  • 题目描述:给定一个二叉树的根节点 root,返回它的 前序遍历 结果。
  • 解题思路:前序遍历的顺序是:根节点 -> 左子树 -> 右子树。可以使用递归或迭代实现。
2. 二叉树的后序遍历(LeetCode 145)
  • 题目描述:给定一个二叉树的根节点 root,返回它的 后序遍历 结果。
  • 解题思路:后序遍历的顺序是:左子树 -> 右子树 -> 根节点。可以使用递归或迭代实现。
3. 二叉树的层序遍历(LeetCode 102)
  • 题目描述:给定一个二叉树的根节点 root,返回它的 层序遍历 结果。
  • 解题思路:使用队列实现广度优先搜索(BFS)。
4. 验证二叉搜索树(LeetCode 98)
  • 题目描述:给定一个二叉树的根节点 root,判断它是否是一个有效的二叉搜索树。
  • 解题思路:中序遍历二叉搜索树的结果是一个递增序列,可以利用这一性质进行验证。
5. 二叉搜索树中的搜索(LeetCode 700)
  • 题目描述:给定一个二叉搜索树的根节点 root 和一个值 val,找到节点值等于 val 的节点。
  • 解题思路:利用二叉搜索树的性质进行搜索。

  1. 总结

  • 中序遍历 是二叉树遍历的基础,掌握递归和迭代的实现方式非常重要。
  • 类似题目包括前序遍历、后序遍历、层序遍历等,都是二叉树遍历的变种。