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},ide1 / \ 2 3 / \ 4 5return 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;//返回新根 } }