目录
1. 层序遍历的基本概念
层序遍历(Level-Order Traversal)是一种广度优先遍历(Breadth-First Traversal, BFT)方法,按照树的层级从上到下、从左到右依次访问每个节点。在二分搜索树中,层序遍历不一定反映值的有序性,但可以直观展示树的结构。它通常使用队列实现。
2. 层序遍历的步骤
层序遍历一个 BST 的过程如下:
- 初始化:
- 创建一个空队列,将根节点入队。
- 遍历每一层:
- 当队列不为空时:
- 取出队首节点并访问(例如打印其值)。
- 将该节点的左子节点(若存在)入队。
- 将该节点的右子节点(若存在)入队。
- 重复步骤 2:
- 直到队列为空,遍历结束。
示例
对以下 BST 进行层序遍历:
5
/ \
3 7
/ \
1 4
- 初始:队列 = [5]
- 访问 5,出队,入队 3 和 7,队列 = [3, 7]
- 访问 3,出队,入队 1 和 4,队列 = [7, 1, 4]
- 访问 7,出队,无子节点,队列 = [1, 4]
- 访问 1,出队,无子节点,队列 = [4]
- 访问 4,出队,无子节点,队列 = []
- 输出:5, 3, 7, 1, 4
3. 时间复杂度分析
- 时间复杂度:O(n)
- 每个节点恰好入队和出队一次,n 为节点数。
- 空间复杂度:O(w)
- w 为树的最大宽度(即某层节点的最大数量)。对于平衡 BST,w ≈ n/2,平均 O(n);最差情况(如退化为链表),w = 1,O(1)。
4. 代码示例(伪代码)
class Node:
value // 节点值
left // 左子节点
right // 右子节点
class BST:
root // 根节点
// 层序遍历
function levelOrder():
if root is null:
return
queue = new Queue()
queue.enqueue(root)
while queue is not empty:
node = queue.dequeue()
print(node.value)
if node.left is not null:
queue.enqueue(node.left)
if node.right is not null:
queue.enqueue(node.right)
5. 参考资料
- Wikipedia: Breadth-First Search
- GeeksforGeeks: Level Order Traversal of Binary Tree
- Baeldung: Level Order Traversal
如果你需要特定语言的实现代码(如 Python、Java)或对层序遍历有进一步疑问,请告诉我!
发表回复