二叉树遍历
二叉树遍历
二叉树的遍历算法主要分为两种:递归遍历以及层序遍历。其中递归遍历可以延伸出DFS算法、回溯算法,而层序遍历可以延伸出BFS算法。
递归遍历(DFS):
递归遍历的代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def traverse(root : TreeNode):
if root is None:
return
# 前序位置
traverse(root.left)
# 中序位置
traverse(root.right)
# 后序位置
二叉搜索树的遍历结果是有序的。
层序遍历(BFS):
层序遍历需要借助队列来实现,且根据不同的需要有三种实现方法:
- 最简单的实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from collections import deque def LevelOrderTraverse(root): if root is None: return q = deque() q.append(root) while q: current = q.popleft() print (current.value) if current.left is not None: q.append(current.left) if current.right is not None: q.append(current.right)
- 优点:实现简单,每次仅需要将队头元素取出,将其左右子节点加入队列即可。
- 缺点:无法知道当前节点在第几层,即无法解决这些问题:该二叉树的最小深度、收集二叉树节点。
- 因此对以上算法进行改造:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
from collections import deque def LevelOrderTraverse(root): if root is None: return q = deque() q.append(root) # 根节点视为第一层 depth = 1 while q: # 需要注意的是sz需要在遍历前记下来,因为在循环的过程中q的长度是会变化的 sz = len(q) for i in range(sz): current = q.popleft() print (f"Depth = {depth}, Value = {current.value}") if current.left is not None: q.append(current.left) if current.right is not None: q.append(current.right) depth += 1
- 现在添加一个
State类以实现每条树枝权重和为任意值的情况,让每个节点维护自己的权重:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
from collections import deque class State: def __init__(self, node, depth): self.node = node self.depth = depth def LevelOrderTraverse(root): if root is None: return q = deque() # 根节点的路径权重和是1 q.append(State(root, 1)) while q: current = q.popleft() print(f"Depth = {current.depth}, Value = {current.value}") if current.node.left is not None: q.append(State(current.node.left, current.depth + 1)) if current.node.right is not None: q.append(State(current.node.right, current.depth + 1))
其他遍历方式皆是换汤不换药
This post is licensed under CC BY 4.0 by the author.