[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