[Leetcode] Binary Tree Upside Down 二叉樹上下調個兒

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.node

For example:
Given a binary tree {1,2,3,4,5},ide

1
   / \
  2   3
 / \
4   5

return the root of the binary tree [4,5,2,#,#,3,1].code

4
  / \
 5   2
    / \
   3   1

遞歸

複雜度

O(N) 時間 O(N) 空間遞歸

思路

啥叫upsidedown?ip

a                         b
   / \        ----->         / \
  b   c                     c   a

upsidedown的意思就是把這三個node順時針換一下位置。
整個樹最後的頂點是原樹最左的孩子。
假設遞歸來到了a爲root的這一層(如上圖左),a的左邊返回了新的樹根b,
注意此時b表明一個子樹,c也表明一個子樹
咱們要把b扶持登基爲根,而後c和a往哪放呢?b是一顆子樹啊,人家已經有左右孩子了,容不下c和a了,分析題目給的例子,題意要把他們放到b的最右的孩子下面
把這個最右的孩子叫作rightMostNode,rightMostNode是個葉子節點沒有左右孩子喔,因而咱們把c拖家帶口(帶着他的孩子們)掛在rightMostNode的左邊,把a誅九族後(爲了不造成cycle,咱們只要a本身,把他的孩子(b和c)都去掉,即從新實例化一個a,左右孩子爲Null)掛在他的右邊,返回新的根(b的根)便可it

注意

這題理解起來費勁io

代碼

public class Solution {
    //返回新的樹根
    public TreeNode upsideDownBinaryTree(TreeNode root) {
        if (root == null || root.left == null)
            return root;
        TreeNode newRoot = upsideDownBinaryTree(root.left);//新樹根在最左
        TreeNode rightMostIterator = newRoot;//找新根的最右,掛兩個旋轉得來的的孩子
        while (rightMostIterator.right != null) {
            rightMostIterator = rightMostIterator.right;
        }
        rightMostIterator.left = root.right;//原右孩子拖家帶口投奔新根的左邊
        rightMostIterator.right = new TreeNode(root.val);//原root誅九族去右邊
        return newRoot;//返回新根
    }
}
相關文章
相關標籤/搜索