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
confused what
Recursive solution:"{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.The recursive solution could be bottom-up. Note that we need a parent node to save the node's parent. Also we use the return value just to store the new node.
这个题的关键是反转以后的binary tree 的 root 是以前二叉树的 最左边的 leaf node. 利用这个性质,我们先一路走到最左边的那个leaf node, 并且记录一下当前节点和之前的parent node。找到这个节点以后,利用返回值一直把这个点传回来。在back tracking 的过程中,当前root 的 left child 是 parent.right. (注意要判断parent 是否为null)。如果parent == null, root.left = null; 如果没有这一句,树里面就有一个环!!root.right = parent
这个题的思路比较类似reverse linked list in recursive way.
Code (Java):
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode upsideDownBinaryTree(TreeNode root) {
if (root == null) {
return null;
}
return upsideDownBinaryTreeHelper(root, null);
}
private TreeNode upsideDownBinaryTreeHelper(TreeNode root, TreeNode parent) {
if (root == null) {
return parent;
}
TreeNode newNode = upsideDownBinaryTreeHelper(root.left, root);
root.left = parent == null ? null : parent.right;
root.right = parent;
return newNode;
}
}
Iterative solution:
这个属于自顶向下的方法。需要注意的是在向下走的过程中parent 其实已经被更新了,所以p.left 就不能指向parent.right, 因为 parent.right 已经在向下遍历的过程里面丢了!所以需要保存这个parent.right 这个node.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode upsideDownBinaryTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode parent = null;
TreeNode parentRightChild = null;
TreeNode p = root;
while (p != null) {
TreeNode next = p.left;
p.left = parentRightChild;
parentRightChild = p.right;
p.right = parent;
parent = p;
p = next;
}
return parent;
}
}
This comment has been removed by the author.
ReplyDelete