Leetcode Tree problem collection (2)
- 199.Binary Tree Right Side View
- 105.Construct Binary Tree from Preorder and Inorder Traversal
- 236.Lowest Common Ancestor of a Binary Tree
- 987.Vertical Order Traversal of a Binary Tree
- 103.Binary Tree Zigzag Level Order Traversal
Basic About Tree:
Preorder: root - left - right
Inorder: left - root - right
Postorder: left - right - root
199. Binary Tree Right Side View
dfs, root -> right -> left1
2
3
4
5
6
7
8
9
10
11
12
13def rightSideView(self, root: TreeNode) -> List[int]:
    res = {}
    
    def dfs(node, level = 1):
        if not node:
            return
        if level not in res:
            res[level] = node.val
        dfs(node.right, level + 1)
        dfs(node.left, level + 1)
    
    dfs(root)
    return list(res.values())
105. Construct Binary Tree from Preorder and Inorder Traversal
get root from 1st level of preorder
get child inorder by deviding inorder by root.val
get child preorder by number of child inorder
| 1 | def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: | 
236. Lowest Common Ancestor of a Binary Tree
My initial AC is backtracking but only beats 5%… I searched all ancestor of p and q and find their LCA, which is super low. Here’s a more concise DFS solution1
2
3
4
5
6
7
8
9
10
11def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
    if not root or root == p or root == q:
        return root
    left = self.lowestCommonAncestor(root.left, p, q)
    right = self.lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    if not left:
        return right
    if not right:
        return left
987. Vertical Order Traversal of a Binary Tree
Use Hashmap to log node coordinate. If in the same y level, sort it.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21def verticalTraversal(self, root: TreeNode) -> List[List[int]]:
    from collections import defaultdict
    coordinates = defaultdict(lambda: defaultdict(list))
    res = []
    
    def searchInorder(node, x, y):
        if not node:
            return
        coordinates[x][y].append(node.val)
        searchInorder(node.left, x-1, y-1)
        searchInorder(node.right, x+1, y-1)
        return
    
    searchInorder(root, 0, 0)
    for x in sorted(coordinates.keys()):
        cur = []
        levels = coordinates[x]
        for y in sorted(levels.keys(), reverse=True):
            cur += sorted(levels[y])
        res.append(cur)
    return res
103. Binary Tree Zigzag Level Order Traversal
Classic BFS.
Odd level: left -> right
Even level: right -> left1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
    res = []
    if not root:
        return res
    q = [(root, 1)]
    while q:
        node, level = q.pop(0)
        if len(res) < level:
            res.append([])
        # odd level: left -> right
        if bool(level % 2):
            res[level - 1].append(node.val)
        else:
            res[level - 1] = [node.val] + res[level - 1] 
        if node.left:
            q.append((node.left, level + 1))
        if node.right:
            q.append((node.right, level + 1))
    return res