快速学习二叉树的基本知识:性质、遍历、和应用

二叉树(Binary Tree)是计算机科学中一种重要的树形数据结构,广泛用于数据存储、搜索和排序等场景。我们从基本概念、性质、常见操作到具体实现逐步介绍。


1. 二叉树的基本概念

二叉树是一种特殊的树,每个节点最多只能有两个子节点,分别称为 左子节点(Left Child)右子节点(Right Child)

分类

  • 满二叉树(Full Binary Tree):所有节点要么是叶子节点,要么都有两个子节点。
  • 完全二叉树(Complete Binary Tree):从上到下、从左到右依次填满的二叉树,可能最后一层不满,但一定是从左往右排列。
  • 平衡二叉树(Balanced Binary Tree):任意节点的左右子树高度差不超过 1(如 AVL 树)。
  • 二叉搜索树(Binary Search Tree, BST):满足 左子树的所有节点 < 根节点 < 右子树的所有节点,便于快速查找。

2. 二叉树的基本性质

假设二叉树的深度为 hh,节点数为 nn,有以下性质:

  1. 节点数上限:满二叉树最多有 2h−12^h - 1 个节点。
  2. 叶子节点数:在满二叉树中,叶子节点个数等于非叶子节点个数加 1。
  3. 完全二叉树的特点
    • 叶子节点只可能出现在最后两层。
    • 如果某个节点有右子节点,一定有左子节点。

3. 二叉树的遍历

遍历是二叉树的重要操作,分为 深度优先遍历(DFS)广度优先遍历(BFS)

(1)深度优先遍历(DFS)

DFS 包括:

  • 前序遍历(Preorder): 根 → 左子树 → 右子树
  • 中序遍历(Inorder): 左子树 → 根 → 右子树
  • 后序遍历(Postorder): 左子树 → 右子树 → 根

递归实现(以 Python 为例):

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 前序遍历
def preorder_traversal(root):
    if not root:
        return []
    return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right)

# 中序遍历
def inorder_traversal(root):
    if not root:
        return []
    return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right)

# 后序遍历
def postorder_traversal(root):
    if not root:
        return []
    return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.val]

(2)广度优先遍历(BFS)

BFS 使用队列(Queue)进行层序遍历:

from collections import deque

def level_order_traversal(root):
    if not root:
        return []
    result = []
    queue = deque([root])
    while queue:
        node = queue.popleft()
        result.append(node.val)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return result

4. 二叉搜索树(BST)

(1)BST 的特点

  • 左子树所有节点小于根节点。
  • 右子树所有节点大于根节点。
  • 适合查找、插入和删除操作,平均时间复杂度 O(log⁡n)O(\log n)。

(2)查找操作

def search_BST(root, val):
    if not root or root.val == val:
        return root
    return search_BST(root.left, val) if val < root.val else search_BST(root.right, val)

(3)插入操作

def insert_BST(root, val):
    if not root:
        return TreeNode(val)
    if val < root.val:
        root.left = insert_BST(root.left, val)
    else:
        root.right = insert_BST(root.right, val)
    return root

(4)删除操作

def delete_BST(root, val):
    if not root:
        return root
    if val < root.val:
        root.left = delete_BST(root.left, val)
    elif val > root.val:
        root.right = delete_BST(root.right, val)
    else:
        if not root.left:
            return root.right
        elif not root.right:
            return root.left
        temp = find_min(root.right)  # 找右子树最小节点
        root.val = temp.val
        root.right = delete_BST(root.right, temp.val)
    return root

def find_min(node):
    while node.left:
        node = node.left
    return node

5. 平衡二叉树(AVL树)

二叉搜索树可能会变得倾斜,导致查找效率降低。AVL 树 通过 旋转操作(左旋、右旋)来保持平衡,保证查找操作的时间复杂度接近 O(log⁡n)O(\log n)。


6. 二叉树的应用

  • 哈夫曼树(Huffman Tree): 用于数据压缩(如 Huffman 编码)。
  • 二叉堆(Binary Heap): 用于优先队列(如堆排序)。
  • 表达式树(Expression Tree): 用于计算表达式(如四则运算)。
  • 红黑树(Red-Black Tree): 一种自平衡二叉搜索树,用于数据库索引。

7. 练习题

  • 基础题

    • 计算二叉树的高度
    • 判断二叉树是否为平衡二叉树
    • 翻转二叉树(镜像)
  • 进阶题

    • 判断二叉搜索树是否合法
    • 找二叉搜索树的最近公共祖先
    • 实现二叉树的序列化和反序列化(LeetCode 297)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值