上下翻轉二叉樹

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;
}
相關文章
相關標籤/搜索