目录
一、问题描述
二、解题思路
三、代码
四、复杂度分析
一、问题描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
二、解题思路
-
定义一个结果数组
result
-
从根节点开始,用递归方式先访问左子树
-
左子树返回后,将当前节点加入结果
-
然后再递归访问右子树
三、代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result; // 用来存储中序遍历结果
inorder(root, result); // 调用递归函数
return result;
}
private:
void inorder(TreeNode* node, vector<int>& result) {
if (!node) return; // 如果节点为空,直接返回
inorder(node->left, result); // 先递归遍历左子树
result.push_back(node->val); // 再访问当前节点
inorder(node->right, result); // 最后递归遍历右子树
}
};
四、复杂度分析
时间复杂度:O(n)
-
每个节点都会被访问一次,无论是左子树、当前节点、还是右子树。
-
所以时间复杂度为 O(n),其中
n
是树中的节点总数。
🧠 空间复杂度:
▶ 最好情况(平衡二叉树):
-
递归调用栈的最大深度是树的高度
h = log(n)
,空间复杂度为 O(log n)
▶ 最坏情况(完全退化为链表):
-
递归调用栈会到达
n
层,空间复杂度为 O(n)
✅ 最终空间复杂度总结:
空间复杂度 = 递归调用栈 O(h) + 结果数组 O(n)
所以是:O(n) 总体空间复杂度(不论递归深度如何,最终结果数组都要 O(n))