加载笔记内容...
加载笔记内容...
二叉树(Binary Tree) 作为树形结构的典型代表,其数学性质展现了精妙的设计:
1# 节点数关系验证函数
2def verify_leaf_relation(nodes):
3 n0 = sum(1 for node in nodes if node.degree == 0)
4 n2 = sum(1 for node in nodes if node.degree == 2)
5 return n0 == n2 + 1
数组存储的两种经典模式:
1根节点索引为0的方案:
2Parent(i) = (i-1)//2
3Left(i) = 2i+1
4Right(i) = 2i+2
5
6根节点索引为1的方案(常见于旧教材):
7Parent(i) = i//2
8Left(i) = 2i
9Right(i) = 2i+1
工程建议:优先使用链式存储应对非完全二叉树,数组存储适用于完全二叉树场景。实测数据显示,当树高度超过20层时,数组存储的空间浪费可能超过40%。
特征 | 满二叉树 | 完全二叉树 |
---|---|---|
最后一层填充度 | 100% | 可能不满 |
存储效率 | 最高 | 较高 |
应用场景 | 理论模型 | 堆结构实现 |
对于高度h的满二叉树:
1class BSTNode:
2 def __init__(self, val):
3 self.val = val
4 self.left = None
5 self.right = None
6
7def insert(root, val):
8 if not root:
9 return BSTNode(val)
10 if val < root.val:
11 root.left = insert(root.left, val)
12 else:
13 root.right = insert(root.right, val)
14 return root
时间复杂度分析:
2021年Redis团队在改进Sorted Set底层实现时,放弃了严格的BST结构,转而采用跳表结构。这个案例揭示了BST的局限性:当数据存在偏斜时,性能可能急剧下降。
平衡因子(Balance Factor):BF(node) = height(left) - height(right)
四种基本旋转场景:
1def rotate_right(y):
2 x = y.left
3 T2 = x.right
4
5 x.right = y
6 y.left = T2
7
8 y.height = 1 + max(get_height(y.left), get_height(y.right))
9 x.height = 1 + max(get_height(x.left), get_height(x.right))
10
11 return x
在100万次插入操作的测试中:
数据表明AVL树在查询密集型场景仍具有优势,但维护平衡的代价使得其插入性能略低于红黑树。
根据应用场景选择合适结构:
1是否需要持久化存储?
2→ 是 → 考虑B+树
3→ 否 → 需要严格平衡?
4 → 是 → AVL树
5 → 否 → 红黑树
Google面试题:设计高效的二叉树序列化方案
1def serialize(root):
2 if not root:
3 return "None"
4 return f"{root.val},{serialize(root.left)},{serialize(root.right)}"
5
6def deserialize(data):
7 def helper(values):
8 val = next(values)
9 if val == "None":
10 return None
11 node = TreeNode(int(val))
12 node.left = helper(values)
13 node.right = helper(values)
14 return node
15 values = iter(data.split(","))
16 return helper(values)
某金融系统在交易风控模块中采用AVL树存储实时报价数据,初期出现性能瓶颈。通过以下优化提升3倍性能:
通过深入理解二叉树的核心原理和演进脉络,开发者可以更好地应对不同场景下的数据结构选择挑战。在系统设计中,没有绝对的最优解,只有最适合当前约束条件的平衡选择。