前序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return nullptr;
// 先处理根节点,即先序遍历
TreeNode* temp = root->right; // 保存右节点
root->right = root->left;
root->left = temp;
//---------根节点处理完毕-------------
invertTree(root->left); // 处理左节点
invertTree(root->right); // 处理右节点
return root;
}
};
中序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return nullptr;
TreeNode* temp = root->right; // 保存右子树
// 先处理左节点然后进行赋值,赋值的过程就是处理根节点的过程
root->right = invertTree(root->left);
root->left = invertTree(temp); // 处理右节点,同时赋值
return root;
}
};
或者像这样写:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return nullptr;
invertTree(root->left); // 将左节点交换
TreeNode* temp = root->right; // 保存右节点
// ---处理根节点----
root->right = root->left;
root->left = temp;
//---根节点处理完毕---
// 递归找到右节点 继续交换 : 因为此时左右节点已经交换了,所以此时的右节点为root.left
invertTree(root->left);
return root;
}
};
后序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return nullptr;
invertTree(root->left); // 处理左节点
invertTree(root->right); // 处理右节点
// ----处理根节点-----
TreeNode* temp = root->right;
root->right = root->left;
root->left = temp;
return root;
}
};
层次遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return nullptr;
// 使用队列实现层次遍历
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* Node = q.front(); // 访问队列的第一个元素
TreeNode* temp = Node->left;
q.pop(); // 删除队列第一个元素
// 如果左节点不为空,入队
if(Node->left!=nullptr) q.push(Node->left);
// 如果右节点不为空,入队
if(Node->right!=nullptr) q.push(Node->right);
// 交换左右结点
Node->left = Node->right;
Node->right = temp;
}
return root;
}
};