156. Binary Tree Upside Down

来源:互联网 发布:平价时尚欧美女装知乎 编辑:程序博客网 时间:2024/06/05 21:55

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 "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

   1  / \ 2   3    /   4    \     5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".
有一个很好的图说明了题意:

This is not a very intuitive problem for me, I have to spent quite a while drawing figures to understand it. As shown in the figure, 1 shows the original tree, you can think about it as a comb, with 1, 2, 4 form the bone, and 3, 5 as the teeth. All we need to do is flip the teeth direction as shown in figure 2. We will remove the link 1--3, 2--5, and add link 2--3, and 4--5. And node 4 will be the new root.

As the recursive solution, we will keep recurse on the left child and once we are are done, we found the newRoot, which is 4 for this case. At this point, we will need to set the new children for node 2, basically the new left node is 3, and right node is 1. Here is the recursive solution:

enter image description here

递归求解。代码如下:

/** * 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 || root.left == null) {            return root;        }        TreeNode newRoot = upsideDownBinaryTree(root.left);        root.left.left = root.right;        root.left.right = root;        root.left = null;        root.right = null;        return newRoot;    }}

原创粉丝点击