题目:
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题解:
递归,从根节点的左子节点开始处理。
C++版:
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root) {
if(root == NULL || (root->left == NULL && root->right == NULL))
return root;
TreeNode* newRoot = upsideDown(root, root->left, root->right);
root->left = NULL;
root->right = NULL;
return newRoot;
}
TreeNode* upsideDown(TreeNode* root, TreeNode* leftChild, TreeNode* rightChild) {
if(leftChild->left == NULL) {
leftChild->left = rightChild;
leftChild->right = root;
return leftChild;
}
TreeNode* curLeft = leftChild->left;
TreeNode* curRight = leftChild->right;
leftChild->left = rightChild;
leftChild->right = root;
return upsideDown(leftChild, curLeft, curRight);
}
};
Java版:
public class Solution {
public TreeNode upsideDownBinaryTree(TreeNode root) {
if(root == null || (root.left == null && root.right == null)) {
return root;
}
TreeNode newRoot = upsideDown(root, root.left, root.right);
root.left = null;
root.right = null;
return newRoot;
}
private TreeNode upsideDown(TreeNode root, TreeNode leftChild, TreeNode rightChild) {
if(leftChild.left == null) {
leftChild.left = rightChild;
leftChild.right = root;
return leftChild;
}
TreeNode curLeft = leftChild.left;
TreeNode curRight = leftChild.right;
leftChild.left = rightChild;
leftChild.right = root;
return upsideDown(leftChild, curLeft, curRight);
}
}
Python版:
class Solution(object):
def upsideDownBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if root == None or (root.left == None and root.right == None):
return root
newRoot = self.upsideDown(root, root.left, root.right)
root.left = None
root.right = None
return newRoot
def upsideDown(self, root, leftChild, rightChild):
if leftChild.left == None:
leftChild.left = rightChild
leftChild.right = root
return leftChild
curLeft = leftChild.left
curRight = leftChild.right
newRoot = leftChild
newRoot.left = rightChild
newRoot.right = root
return self.upsideDown(leftChild, curLeft, curRight)