156. Binary Tree Upside Down

题目:

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  

链接: http://leetcode.com/problems/binary-tree-upside-down/

题解:

翻转二叉树。可以有recursive以及iterative两种方法。 Recursive是自底向上构建,很巧妙。 Iterative写得有点绕,二刷要好好再写一下。对于每个节点,要先保存这个节点,然后再进行修改,弄清楚reference就好写很多。

Recursive, Time Complexity - O(n), Space Complexity - O(logn)

/**
 * 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 && root.right == 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;
    }
}

 

Iterative, Time Complexity - O(n), Space Complexity - O(1)

/**
 * 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 && root.right == null))
            return root;
        TreeNode newLeft = null, newRight = null, oldRight = root.right, newRoot = root.left;
        TreeNode prev = new TreeNode(root.val);
        
        while(newRoot != null) {
            newLeft = newRoot.left;
            newRight = newRoot.right;
            newRoot.left = oldRight;
            newRoot.right = prev;
            prev = newRoot;
            newRoot = newLeft;
            oldRight = newRight;
        }
        
        return prev;
    }
}

 

更简练的Iterative写法

/**
 * 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 && root.right == null))
            return root;
        TreeNode newRoot = root, prev = null, left = null, right = null;

        while(newRoot != null) {
            left = newRoot.left;
            newRoot.left = right;
            right = newRoot.right;
            newRoot.right = prev;
            prev = newRoot;
            newRoot = left;
        }
        
        return prev;
    }
}

 

二刷:

Java:

Recursive:

我们要递归返回新的root,新的root是原二叉树最左端节点。sibling变为新树左节点,原root变为新树右节点。

/**
 * 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;
    }
}

 

Iterative1:

/**
 * 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 root;
        TreeNode left = root.left, right = root.right, newLeft = null, newRight = null;
        root.left = null;
        root.right = null;
        while (left != null) {
            newLeft = left.left;
            newRight = left.right;
            left.left = right;
            left.right = root;
            root = left;
            left = newLeft;
            right = newRight;
        }
        return root;
    }
}

 

Iterative2:

/**
 * 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 root;
        TreeNode left = null, right = null, prev = null;
        while (root != null) {
            left = root.left;
            root.left = right;
            right = root.right;
            root.right = prev;
            prev = root;
            root = left;
        }
        return prev;
    }
}

 

 

 

Reference:

https://leetcode.com/discuss/44718/clean-java-solution

https://leetcode.com/discuss/67458/simple-java-recursive-method-use-one-auxiliary-node 

https://leetcode.com/discuss/18410/easy-o-n-iteration-solution-java

posted @ 2015-05-09 12:34  YRB  阅读(543)  评论(0编辑  收藏  举报