from https://leetcode.com/problems/binary-tree-upside-down/; java
一個列子:在翻轉前ide
1 / \ 2 3 / \ 4 5
翻轉後:code
4 / \ 5 2 / \ 3 1
先從最簡單的狀況開始分析:若是隻有一個節點,那麼返回該節點就能夠了(彷佛太簡單了);若是存在三個節點,父節點和左右子節點(若是有右節點,至少會有一個左節點),那麼新的樹的結構是左節點變爲父節點,右節點變爲新的父節點的左節點,原來的父節點變爲如今的右節點;遞歸
更復雜的狀況,考慮,若是左子樹已經被翻轉了,那麼如今應該把父節點和右節點放在哪裏?有點遞歸的味道了;從例子裏能夠看出,節點1和節點3須要做爲節點2的子節點;而節點2是左子樹翻轉後的最右邊的節點;因此回答放在哪裏的問題,只要找到新的子樹的最右的子節點,並把當前父節點和右節點鏈接上去就能夠了;leetcode
public TreeNode upsideDownBinaryTree(TreeNode root) { if(root == null || (root.left == null && root.right == null)) { return root; } TreeNode leftRoot = upsideDownBinaryTree(root.left); TreeNode tmpNode = leftRoot; while(tmpNode.right != null) { tmpNode = tmpNode.right; } tmpNode.left = root.right; tmpNode.right = root; root.right = null; root.left = null; return leftRoot; }