https://leetcode.cn/problems/invert-binary-tree/
![](https://i-blog.csdnimg.cn/blog_migrate/3cec1724318f00d2d59308d4f9dcc2a3.png)
思路一:递归
首先确立递归三要素:
参数和返回值:
参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。
返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*。(引用代码随想录卡哥的话,个人觉得解释的很清楚)
TreeNode* invertTree(TreeNode* root) {
结束条件:
当指针遍历到空节点的时候结束
TreeNode* cur = root;
if(cur == nullptr) return root;
单层递归逻辑:
交换左右节点数值
swap(cur -> left, cur -> right);
invertTree(cur -> left);
invertTree(cur -> right);
整体代码如下:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
TreeNode* cur = root;
if(cur == nullptr) return root;
swap(cur -> left, cur -> right);
invertTree(cur -> left);
invertTree(cur -> right);
return root;
}
};
思路二:迭代法:
思路:这里注意函数返回二叉树,所以不需要提前设置return数列,直接使用root即可,思路就是在每次要将左右节点入栈之前进行swap。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
//vector<int> result;
stack<TreeNode*> st;
if(root != nullptr) st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
st.pop();
swap(cur -> left, cur -> right);
if(cur -> right) st.push(cur -> right);
if(cur -> left) st.push(cur -> left);
}
return root;
}
};
思路三:层序遍历法:
思路:和迭代法差不多,就是在左右节点入队之前进行swap。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
swap(node->left, node->right); // 节点处理
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return root;
}
};