def preorder(root):
if root:
print(root.val)
preorder(root.left)
preorder(root.right)
中序遍历:左→根→右 应用: 二叉搜索树中序遍历结果有序
后序遍历:左→右→根 应用: 计算表达式树
2. 广度优先遍历
层序遍历:逐层访问节点 队列实现:
收起
python
def levelorder(root):
queue = [root]
while queue:
node = queue.pop(0)
print(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
3. 遍历对比
遍历方式
时间复杂度
空间复杂度
典型应用
前序
O(n)
O(h)
复制树、生成括号
中序
O(n)
O(h)
二叉搜索树排序
后序
O(n)
O(h)
删除树、计算表达式
层序
O(n)
O(w)
层次处理、找最近公共祖先
四、树结构的典型应用
文件系统:目录结构(Windows 资源管理器)
XML/JSON 解析:文档对象模型(DOM)
数据库索引:B 树 / B + 树优化查询
压缩算法:哈夫曼树构建最优前缀编码
人工智能:决策树、蒙特卡洛树搜索
网络路由:路由表的层次化存储
五、高级树结构详解
5.1 B 树(B-Tree)
5.1.1 定义与特性
平衡多路查找树,所有叶子节点在同一层
阶数 m:每个节点最多有 m 个子节点(m≥2)
关键特性:
根节点至少 2 个子节点
非根节点至少⌈m/2⌉个子节点
叶子节点包含所有数据
5.1.2 操作复杂度
操作
时间复杂度
查找
O(log_m n)
插入
O(log_m n)
删除
O(log_m n)
5.1.3 典型应用
数据库索引(如 MySQL 的 InnoDB 引擎)
文件系统目录结构
外部存储数据管理
5.1.4 与二叉搜索树对比
特性
B 树
二叉搜索树
平衡方式
多叉平衡
二叉平衡
查找效率
更低的 I/O 次数
依赖树的高度
适用场景
外存数据管理
内存数据管理
5.2 红黑树(Red-Black Tree)
5.2.1 定义与性质
自平衡二叉搜索树,通过颜色标记保持平衡
五大性质:
节点颜色为红或黑
根节点为黑色
叶子节点(NIL)为黑色
红节点的子节点必须为黑色
从任一节点到其叶子的路径包含相同数量黑节点
5.2.2 操作复杂度
操作
时间复杂度
查找
O(log n)
插入
O(log n)
删除
O(log n)
5.2.3 典型应用
Java 的 TreeMap/TreeSet
C++ 的 std::map
Linux 内核的进程调度
Nginx 的定时器管理
5.2.4 旋转操作
左旋转:将某个节点作为支点向左下方旋转
右旋转:将某个节点作为支点向右上方旋转
示例代码片段:
收起
python
def left_rotate(x):
y = x.right
x.right = y.left
if y.left:
y.left.parent = x
y.parent = x.parent
if x.parent is None:
root = y
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y