Ref :http://www.cnblogs.com/jcliBlogger/p/4572682.html
Problem Description:
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 (parent is 2)
Analysis:
we find that the 1->2 ->4 in the original tree after transformation, It turn out to be 4->2 -> 1. Moreover, for
each node along the path 1->2->4 in the original tree, its new left child is its original right sibling and its right child is its original parent
codes:
class Solution {
public:
TreeNode* upsideDownBinaryTree(TreeNode* root)
{
TreeNode * p = root;
TreeNode * parent = NULL;
TreeNode * sibling = NULL;
while (p){
TreeNode * left = p -> left;
TreeNode * right = p -> right;
p -> left = sibling;
p -> right = parent;
parent = p;
p = left;
sibling = right;
}
return parent;
}
//recursive
TreeNode* upsideDownBinaryTree(TreeNode* root) {
return upsideDown(root, NULL, NULL);
}
TreeNode * upsideDown(TreeNode * root, TreeNode * parent, TreeNode * sibling)
{
if (!root) return parent;
TreeNode * left = root -> left;
TreeNode * right = root -> right;
root -> left = sibling;
root -> right = parent;
return upsideDown(left, root, right);
}
}