题目:
Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into left leaf nodes. Return the new root.
For example:Given a binary tree
{1,2,3,4,5}
,
1 / \ 2 3 / \ 4 5
return the root of the binary tree [4,5,2,#,#,3,1]
.
4 / \ 5 2 / \ 3 1
思路:
刚刚开始没有看懂这道题目的含义,后来参考了网上的说明才明白了。题目的意思是说每个结点的右子树要么为空,要么一定有一个左子树孩子和一个右子树孩子(不存在只含有一个右子树孩子的情况),因此树的形状是左偏的。所以我们的思路就是:将最左边的子树作为最终的根节点,然后递归地将其父节点作为其右孩子,并且父结点的右孩子作为其左孩子。一个非常重要的地方是每次一定要将父结点的左右孩子指针都置为空,因为父结点设置成其左孩子的右孩子之后成了叶子结点,需要将其所属的指针断掉。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
if (!root || !root->left) {
return root;
}
TreeNode *new_root = upsideDownBinaryTree(root->left);
root->left->left = root->right;
root->left->right = root;
root->left = NULL;
root->right = NULL;
return new_root;
}
};