LeetCode Hot 100——94.二叉树的中序遍历
94. 二叉树的中序遍历
题目
给定一个二叉树的根节点 root,返回它的 中序 遍历。
中序遍历简介
中序遍历(Inorder Traversal)是二叉树的一种遍历方式,其访问顺序为:
左子树 → 根节点 → 右子树
对于二叉搜索树(BST),中序遍历会按升序访问所有节点。
示例 1:

输入: root = [1,null,2,3]
输出: [1,3,2]
示例 2:
输入: root = []
输出: []
示例 3:
输入: root = [1]
输出: [1]
提示
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶
递归解法很简单,你可以通过迭代算法完成吗?
解法一:递归法
思路
递归法是最直观的中序遍历实现方式。根据定义:
- 递归遍历左子树
- 访问当前根节点
- 递归遍历右子树
递归终止条件:当前节点为空(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)$(平衡树)。
解法二:迭代法(使用栈)
思路
递归的本质是函数调用栈,因此可以用显式栈来模拟递归过程,实现迭代版的中序遍历。核心思想:
- 从根节点开始,沿左子树不断将节点压入栈中。
- 当左子树走到尽头(当前节点为
NULL)时,从栈顶弹出一个节点进行访问。 - 然后将当前指针移动到该节点的右子树,重复上述过程。
代码实现
/**
* 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$ 个节点。

浙公网安备 33010602011771号