活跃农民
- 积分
- 421
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2022-5-19
- 最后登录
- 1970-1-1
|
今天写了个Tree Traversal模板的note。也贴在这吧(md的贴在这可能排版会很乱?):
### Tree Traversals
- pre-order, in-order, post-order, level-order
- DFS (depth first search) and BFS (breadth first search)
- 
##### pre-order (cur->left->right)
- DFS recursion:
```python
def dfs_preorder(root):
if not root: return
root.val # or other action on node
dfs_preorder(root.left)
dfs_preorder(root.right)
```
- DFS iteration via stack:
```python
def dfs_preorder(root):
if not root: return
stack = [root]
while stack:
node=stack.pop()
node.val
if node.right:
stack.append(node.right) # right first bc stack
if node.left:
stack.append(node.left)
```
##### in-order (left->cur->right)
- DFS recursion:
```python
def dfs_inorder(root):
if not root: return
dfs_inorder(root.left)
root.val
dfs_inorder(root.right)
```
- DFS iteration via stack:
```python
def dfs_inorder(root):
if not root:
return None
stack = []
node = root
while node or stack:
while node:
stack.append(node)
node=node.left
node=stack.pop()
node.val
node=node.right
```
#### post-order (right-left-cur)
- DFS recursion:
```python
def dfs_postorder(root):
if not root: return
dfs_postorder(root.right)
dfs_postorder(root.left)
root.val
```
- DFS iteration via stack:
(pre-order but right first, records all nodes, in the end reverse the result)
```python
def dfs_postorder(root):
ret=[]
if not root: return []
stack=[root]
while stack:
node=stack.pop()
if not node: continue
ret.append(node.val)
if node.left:
stack.append(node.left) #note different from pre-order
if node.right:
stack.append(node.right)
return ret[::-1]
```
##### level-order (left->right->next)
- DFS pre-order, store level info, return with nested list [[lv0],[lv1..],[lv2....]]
- DFS recursion:
```python
def dfs_levelorder(root):
if not root: return []
def dfs_preorder(node,level):
if len(ret)==level:
ret.append([])
ret[level].append(node.val)
if node.left:
dfs_preorder(node.left,level+1)
if node.right:
dfs_preorder(node.right,level+1)
ret=[]
dfs_preorder(root,0)
return ret
```
- DFS iteration via stack:
```python
def dfs_levelorder(root):
if not root: return []
stack=list()
stack.append((root,0))
ret = []
while stack:
node,level=stack.pop()
if level == len(ret):
ret.append([])
ret[level].append(node.val)
if node.left:
stack.append((node.left,level+1))
if node.right:
stack.append((node.right,level+1))
return ret
```
- BFS iteration with Queue:
```python
def bfs(root):
if not root: return []
que = collections.deque()
que.append(root)
ret = []
while que:
cur_level = []
for _ in range(len(que)): # needed to count step in shortest path etc
node=que.popleft() #important, not pop()
cur_level.append(node.val)
if node.left:
que.append(node.left)
if node.right:
que.append(node.right)
ret.append(cur_level)
return ret
```
|
|