Python二叉树详解

二叉树基本概念

二叉树是每个节点最多有两个子节点的树结构,通常称为左子节点和右子节点。二叉树在计算机科学中有广泛应用,如表达式树、二叉搜索树、堆等数据结构。

Python实现二叉树

节点类定义

1class TreeNode:
2    def __init__(self, val=0, left=None, right=None):
3        self.val = val      # 节点存储的值
4        self.left = left    # 左子节点
5        self.right = right  # 右子节点

创建简单二叉树

1# 创建一个简单的二叉树
2#       1
3#      / \
4#     2   3
5#    / \
6#   4   5
7
8root = TreeNode(1)
9root.left = TreeNode(2)
10root.right = TreeNode(3)
11root.left.left = TreeNode(4)
12root.left.right = TreeNode(5)

二叉树遍历方法

1. 深度优先遍历(DFS)

前序遍历(根-左-右)

1def preorder_traversal(root):
2    if root:
3        print(root.val, end=" ")  # 访问根节点
4        preorder_traversal(root.left)
5        preorder_traversal(root.right)

中序遍历(左-根-右)

1def inorder_traversal(root):
2    if root:
3        inorder_traversal(root.left)
4        print(root.val, end=" ")  # 访问根节点
5        inorder_traversal(root.right)

后序遍历(左-右-根)

1def postorder_traversal(root):
2    if root:
3        postorder_traversal(root.left)
4        postorder_traversal(root.right)
5        print(root.val, end=" ")  # 访问根节点

2. 广度优先遍历(BFS)/层次遍历

1from collections import deque
2
3def level_order_traversal(root):
4    if not root:
5        return
6    
7    queue = deque([root])
8    while queue:
9        node = queue.popleft()
10        print(node.val, end=" ")
11        if node.left:
12            queue.append(node.left)
13        if node.right:
14            queue.append(node.right)

二叉树常见操作

计算树的高度

1def tree_height(root):
2    if not root:
3        return 0
4    return 1 + max(tree_height(root.left), tree_height(root.right))

查找节点

1def find_node(root, target):
2    if not root:
3        return False
4    if root.val == target:
5        return True
6    return find_node(root.left, target) or find_node(root.right, target)

统计节点数量

1def count_nodes(root):
2    if not root:
3        return 0
4    return 1 + count_nodes(root.left) + count_nodes(root.right)

特殊二叉树类型

1. 二叉搜索树(BST)

  • 左子树所有节点值小于根节点值
  • 右子树所有节点值大于根节点值
  • 左右子树也都是二叉搜索树
1def is_valid_bst(root, min_val=float('-inf'), max_val=float('inf')):
2    if not root:
3        return True
4    if root.val <= min_val or root.val >= max_val:
5        return False
6    return (is_valid_bst(root.left, min_val, root.val) and 
7            is_valid_bst(root.right, root.val, max_val))

2. 平衡二叉树(AVL树)

  • 任意节点的左右子树高度差不超过1
1def is_balanced(root):
2    def check_height(node):
3        if not node:
4            return 0
5        left = check_height(node.left)
6        right = check_height(node.right)
7        if left == -1 or right == -1 or abs(left - right) > 1:
8            return -1
9        return 1 + max(left, right)
10    
11    return check_height(root) != -1

实际应用场景

  1. 文件系统结构:目录和子目录的关系
  2. 数据库索引:B树和B+树是二叉树的扩展
  3. 压缩算法:哈夫曼编码树
  4. 游戏AI:决策树的构建
  5. 网络路由:路由表的高效查找