/** * 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) {} * }; */ // 翻转以 root 为根的二叉树,然后返回翻转后的二叉树的根节点 class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == nullptr) return nullptr; if (root->left == nullptr && root->right == nullptr) { return root; } TreeNode *left = invertTree(root->left); TreeNode *right = invertTree(root->right); root->right = left; root->left = right; return root; } };
时间: 2025-07-08 13:15:42 浏览: 3
<think>好的,我现在需要分析用户提供的翻转二叉树的C++代码,并回答相关问题。首先,用户给出的是一个Solution类中的invertTree函数,该函数接受一个TreeNode指针作为参数,返回翻转后的根节点。我的任务是解释这段代码的工作原理,可能的问题以及优化点。
首先,我应该仔细阅读代码。代码的结构看起来是一个递归实现。递归终止条件是当root为空时返回nullptr,或者当左右子节点都为空时返回自身。然后递归处理左右子树,交换它们的指针,最后返回根节点。
接下来,我需要验证这段代码的正确性。翻转二叉树通常的做法是交换每个节点的左右子节点,然后递归地处理左右子树。这段代码确实在递归调用之后交换了left和right指针,看起来是正确的。但是,我需要检查递归终止条件是否正确。原代码中的第二个条件检查左右子节点是否都为空,如果是的话直接返回root。不过这个条件可能没有必要,因为即使当前节点有子节点,递归调用会处理它们。实际上,这个条件可能可以省略,因为即使左右子节点存在,递归会继续下去,而如果不存在,交换左右子节点(都是nullptr)也没有问题。因此,这个条件可能多余,可以移除以简化代码。
另外,考虑代码的效率。由于每个节点都被访问一次,时间复杂度是O(n),空间复杂度在最坏情况下(比如链表结构的树)是O(n),平均情况下是O(log n)的递归栈空间。这些都是合理的,没有明显的性能问题。
然后,用户可能的问题可能涉及代码的正确性、优化、或者替代方法。例如,是否可以使用迭代方法?或者如何处理特殊情况?此外,用户可能想知道为什么在某些情况下需要那个多余的终止条件。
在解释部分,我需要指出代码的正确性,同时指出可以优化的地方,比如移除不必要的条件判断。另外,可能需要提到非递归的实现方式,比如使用栈或队列进行层序遍历,交换每个节点的左右子节点。
然后,根据用户的要求,生成相关问题。这些问题应该围绕二叉树翻转的不同实现方法、时间空间复杂度、递归和迭代的区别等。
现在,整理回答的结构:首先确认代码的正确性,然后指出可以优化的点,比如移除冗余的条件判断。接着,解释递归过程的时间复杂度,并可能提供一个迭代版本的示例代码。最后,提出相关问题。
在编写示例代码时,迭代版本可以使用队列进行广度优先搜索,每次处理节点时交换其左右子节点,并将子节点加入队列继续处理。
最后,生成的相关问题应该覆盖递归和迭代方法、时间复杂度、空间复杂度、以及相关的应用场景。</think><<
这段代码实现了二叉树翻转功能,通过递归方式交换每个节点的左右子树。以下是关键点分析:
正确性分析:
1. 基础情况处理:当root为空时直接返回nullptr
2. 递归过程:先处理子树再交换当前节点的左右指针
3. 返回值:始终返回当前节点作为新子树的根
优化建议:
1. 可以删除第二个if条件(root->left和right都为nullptr的判断),因为递归处理空子树是安全的
2. 优化后的版本:
```cpp
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return nullptr;
TreeNode* temp = root->left;
root->left = invertTree(root->right);
root->right = invertTree(temp);
return root;
}
};
```
时间复杂度:
- 时间复杂度:O(n) 每个节点访问一次
- 空间复杂度:O(h) 递归栈空间(h为树的高度)
迭代实现示例:
```cpp
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return nullptr;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* curr = q.front();
q.pop();
TreeNode* temp = curr->left;
curr->left = curr->right;
curr->right = temp;
if (curr->left) q.push(curr->left);
if (curr->right) q.push(curr->right);
}
return root;
}
};
```
>>
阅读全文
相关推荐












