题目来源
题目描述
给你一个二叉树的根节点 root,请你将此二叉树上下翻转,并返回新的根节点。
你可以按下面的步骤翻转一棵二叉树:
- 原来的左子节点变成新的根节点
- 原来的根节点变成新的右子节点
- 原来的右子节点变成新的左子节点
上面的步骤逐层进行。题目数据保证每个右节点都有一个同级节点(即共享同一父节点的左节点)且不存在子节点。
示例 1:
输入:root = [1,2,3,4,5]
输出:[4,5,2,null,null,3,1]
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
}
};
题目解析
递归
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
if(root == nullptr || root->left == nullptr){
return root;
}
TreeNode *left = root->left;
TreeNode *right = root->right;
root->left = NULL;//上下断开
root->right = NULL;
auto p = upsideDownBinaryTree(left);
p->left = right;
p->right = root;
return p;
}
};
递归
class Solution {
TreeNode *process(TreeNode * node, TreeNode *left, TreeNode *right){
if(left == nullptr){
return node;
}
TreeNode *ans = process(left, left->left, left->right);
left->left = right; left->right = node;
node->left = node->right = nullptr;
return ans;
}
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
if(root == nullptr || root->left == nullptr){
return root;
}
return process(root, root->left, root->right);
}
};