leetcode 226题
方法一:递归
(后序)
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
(先序)
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
swap(root->left, root->right); // 根
/* 是将当前节点的左右子树交换
TreeNode *tmp = root->right;
root->right = root->left;
root->left = tmp;
*/
//递归交换当前节点的 左子树
invertTree(root->left); // 左
//递归交换当前节点的 右子树
invertTree(root->right); // 右
/函数返回时就表示当前这个节点,以及它的左右子树
//都已经交换完了
return root;
}
};
方法三:层次遍历(队列非递归)
TreeNode* invertTree(TreeNode* root) {
if (!root) return root;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
auto p = q.front();
q.pop();
swap(p->left, p->right);
if (p->left) q.push(p->left);
if (p->right) q.push(p->right);
}
return root;
}