设二叉树共有 $n$ 个结点,函数 preorderTraversal 以下代码的时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
};
void preorder(TreeNode *root, vector<int> &res) {
if (root == nullptr) {
return;
}
res.push_back(root->val);
preorder(root->left, res);
preorder(root->right, res);
}
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
preorder(root, res);
return res;
};分析时间复杂度时关注循环层数和每层迭代次数,递归算法则分析递归树。注意最坏/最好/平均情况的区别。
分析复杂度时注意外层循环和内层循环的关联。例如内外两层都到n的循环不一定是O(n²),要看内层是否每次都在缩小。
【考点】二叉树遍历|递归复杂度分析|最坏情况
GESP 六级算法设计模块,命题人卡住的是学生"只看代码行数"的直觉。时间复杂度公式 O(n) 是 GESP 六级明确要求的,但空间复杂度 O(n) 才是这道题的杀手锏——它要求考生不仅会看"push_back",还要能追踪递归栈的线性增长。