LeetCode Hot 100——94.二叉树的中序遍历

94. 二叉树的中序遍历

题目

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

中序遍历简介

中序遍历(Inorder Traversal)是二叉树的一种遍历方式,其访问顺序为:

左子树 → 根节点 → 右子树

对于二叉搜索树(BST),中序遍历会按升序访问所有节点。

示例 1:

img

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

示例 2:

输入: root = []
输出: []

示例 3:

输入: root = [1]
输出: [1]

提示

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

进阶

递归解法很简单,你可以通过迭代算法完成吗?


解法一:递归法

思路

递归法是最直观的中序遍历实现方式。根据定义:

  1. 递归遍历左子树
  2. 访问当前根节点
  3. 递归遍历右子树

递归终止条件:当前节点为空(NULL)时直接返回。

代码实现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void inorder(struct TreeNode* root, int* res, int* resSize) {
    if (!root) {
        return;
    }
    inorder(root->left, res, resSize);
    res[(*resSize)++] = root->val;
    inorder(root->right, res, resSize);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int* res = malloc(sizeof(int) * 100);
    *returnSize = 0;
    inorder(root, res, returnSize);
    return res;
}

复杂度分析

  • 时间复杂度: $O(n)$,其中 $n$ 为节点数,每个节点恰好被访问一次。
  • 空间复杂度: $O(n)$,递归调用栈的深度最坏情况下为 $n$(链状树),平均为 $O(\log n)$(平衡树)。

解法二:迭代法(使用栈)

思路

递归的本质是函数调用栈,因此可以用显式栈来模拟递归过程,实现迭代版的中序遍历。核心思想:

  1. 从根节点开始,沿左子树不断将节点压入栈中。
  2. 当左子树走到尽头(当前节点为 NULL)时,从栈顶弹出一个节点进行访问。
  3. 然后将当前指针移动到该节点的右子树,重复上述过程。

代码实现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int* res = malloc(sizeof(int) * 100);
    struct TreeNode** stack = malloc(sizeof(struct TreeNode*) * 100);
    int top = -1;
    *returnSize = 0;
    struct TreeNode* curr = root;

    while (curr != NULL || top != -1) {
        // 沿左子树一直压栈
        while (curr != NULL) {
            stack[++top] = curr;
            curr = curr->left;
        }
        // 弹出栈顶节点并访问
        curr = stack[top--];
        res[(*returnSize)++] = curr->val;
        // 转向右子树
        curr = curr->right;
    }

    free(stack);
    return res;
}

复杂度分析

  • 时间复杂度: $O(n)$,每个节点入栈和出栈各一次。
  • 空间复杂度: $O(n)$,栈最多存储 $n$ 个节点。
posted @ 2026-07-22 11:04  Javenwww  阅读(4)  评论(0)    收藏  举报