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:{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); } };
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); } }
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)