close

114Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1
        / \
       2   5
      / \   \
     3   4   6

 

The flattened tree should look like:

   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

做法是top down,因為tree 走法是preorder traversal ,所以show的順序是root -> left subtree -> right subtree

所以我們要建這個list,可以用reverse preorder traversal 的方式,所以從right subtree先做然後再接上leftsubtree然後再root

做法上要確定兩點,一個就是rightsubtree是否能正確接上left subtree,然後就是left subtree能否正確接上root

首先call flatten (root.right) 後記錄頭prev之後,call flatten(root.left)時,我們recursively下會走到 這個 left subtree‘s rightmost (因為我們先call right 的dfs)後接上之前紀錄的 right subtree的頭,也就是prev

也因此我們確定rightsubtree可以正確接上leftsubtree,接下來就是第二部 確定left subtree能接上root,但這就簡單了

leftsubtree flatten後我們再把頭記錄到prev,然後將他跟root.right相接就完成了

最後回傳root當頭,整個list 就算完成

/**  * Definition for a binary tree node.  * public class TreeNode {  * int val;  * TreeNode left;  * TreeNode right;  * TreeNode(int x) { val = x; }  * }  */ class Solution { TreeNode prev = null; public void flatten(TreeNode root) { if(root == null) return; flatten(root.right); flatten(root.left); root.right = prev; root.left = null; prev = root; } }

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 angledark0123 的頭像
    angledark0123

    CONY的世界

    angledark0123 發表在 痞客邦 留言(1) 人氣()