代码改变世界

[LeetCode] 114. Flatten Binary Tree to Linked List_Medium tag: DFS

2018-07-13 07:09  Johnson_强生仔仔  阅读(197)  评论(0编辑  收藏  举报

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

For example, given the following tree:

    1
   / \
  2   5
 / \   \
3   4   6

The flattened tree should look like:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

 

这个题思路就是DFS, 先左后右, 记住如果是用stack如果需要先得到左, 那么要先append右, 另外需要注意的就是用recursive方式的时候需要用一个temp来去存root.right, 否则用preorder的时候root.right就是丢了!

 

1. Constraints

1) can be empty

 

2. Ideas

DFS    T: O(n)     S:O(n)

用pre来存之前的node, 然后DFS

 

 Update 06/18/2021 :   利用Morris Traversal 可以达到T: O(n)     S:O(1), refer: Morris Traversal_ O(1) space to change binary tree to linked list

3. Code

3.1) iterable

 1 class Solution:
 2     def flatten(self, root):
 3         pre, stack = None, [root]
 4         while stack:
 5             node = stack.pop()
 6             if node:
 7                 if pre:
 8                     pre.left = None  # dont forget to set left as None
 9                     pre.right = node
10                 pre = node
11                 stack.append(node.right) # stack 先进后出
12                 stack.append(node.left)

 

3.2) recursive

 1 class Solution:
 2     def __init__(self):
 3         self.pre = None
 4     def flatten(self, root):
 5         if not root: return
 6         if self.pre:
 7             self.pre.left = None
 8             self.pre.right = root
 9         self.pre = root
10         temp = root.right  # otherwise we will lose the root.right
11         self.flatten(root.left)
12         self.flatten(temp)

 

4. Test cases

1) None

2) 

    1
   / \
  2   5
 / \   \
3   4   6