
思路 一个二叉树,怎么才算翻转了?

class Solution {
public:
TreeNode* invertTree(TreeNode* root)
{
if (root == nullptr)
return nullptr;
invertTree(root->left);
invertTree(root->right);
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
return root;
}
};
递归思路 2

class Solution {
public:
TreeNode* invertTree(TreeNode* root)
{
if (root == nullptr)
return nullptr;
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);
return root;
}
};
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;//返回当前子树的根节点
}
};
复盘总结
唯一的区别是:
这个「处理当前节点」,就是交换左右子树 ,就是解决问题的代码:
const temp = root.left;
root.left = root.right;
root.right = temp;评论区有人问递归到 null 不知道返回什么: 递归做的事——交换当前root的左右子树,返回root。遍历到 null,它没有子树可交换,返回出这个子树(null)
用层序遍历的方式去遍历二叉树。
class Solution {
public:
TreeNode* invertTree(TreeNode* root)
{
if (root ==nullptr) return nullptr;
queue<TreeNode*> q;
//根节点入队
q.push(root);
while (!q.empty())
{
//队头元素出队
TreeNode* first=q.front();
q.pop();
//交换左右孩子节点
TreeNode* temp = first->left;
first->left = first->right;
first->right = temp;
//将当前根节点的左右孩子入队---不为空才入队
//入队的目的是为了待会出队的时候,交换以当前节点为根的子孙的左右孩子节点
if (first->left) q.push(first->left);
if (first->right) q.push(first->right);
}
return root;
}
};
剑指 Offer 27. 二叉树的镜像与本题的是一模一样的题型,读者有空也可以尝试去做一下这道题