题目地址:力扣
翻转二叉树这道题目,根据力扣上的图示可以很好的理解,就是左子树和右子树交换位置,左子树的左子树和左子树的右子树交换位置,以此类推,因此这道题目应该是一道递归很好解的题目。
解法1:从上往下递归
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
// tmp用来临时保存节点
TreeNode* tmp;
// 只要当前节点不空
if (root != nullptr)
{
// 以下三行代码完成了左子树与右子树的互换
tmp = root->left;
root->left = root->right;
root->right = tmp;
// 继续互换左子树的左子树和右子树的右子树
invertTree(root->left);
invertTree(root->right);
}
// 只需要最外层返回即可,内层的返回没有用处
return root;
}
};
解法2:从下往上递归
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
// 若节点为空直接返回空
if (root == nullptr)
return root;
// 还是需要一个临时节点来存下root的右孩子或者左孩子,这里存的是右孩子
TreeNode* tmp = root->right;
// 以下步骤将左右孩子交换然后返回当前节点给上层
root->right = invertTree(root->left);
root->left = invertTree(tmp);
return root;
}
};
Accepted
- 77/77 cases passed (0 ms)
- Your runtime beats 100 % of cpp submissions
- Your memory usage beats 35.95 % of cpp submissions (9.5 MB)