Java 数据结构指南:二叉树、二叉查找树、平衡树与红黑树

1. 什么是二叉树?

1.1 二叉树的基本概念

二叉树(Binary Tree)是每个节点最多有两个子节点的树形结构。每个节点包含:

  • 数据(value)
  • 左子节点(left)
  • 右子节点(right)

二叉树的 Java 实现:

class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;
    
    public TreeNode(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

1.2 二叉树的遍历

二叉树的遍历方式主要包括:

  • 前序遍历(根 → 左 → 右)
  • 中序遍历(左 → 根 → 右)
  • 后序遍历(左 → 右 → 根)
  • 层序遍历(BFS,按层访问)

示例:

void preOrder(TreeNode node) {
    if (node != null) {
        System.out.print(node.value + " ");
        preOrder(node.left);
        preOrder(node.right);
    }
}

2. 什么是二叉查找树(BST)?

2.1 BST 的定义

二叉查找树(Binary Search Tree, BST)满足:

  • 左子树 的所有节点值 < 根节点值
  • 右子树 的所有节点值 > 根节点值
  • 每个子树 也是一个 BST

2.2 BST 的操作

插入元素:

TreeNode insert(TreeNode root, int value) {
    if (root == null) return new TreeNode(value);
    if (value < root.value) root.left = insert(root.left, value);
    else root.right = insert(root.right, value);
    return root;
}

查找元素:

boolean search(TreeNode root, int value) {
    if (root == null) return false;
    if (value == root.value) return true;
    return value < root.value ? search(root.left, value) : search(root.right, value);
}

3. 什么是二叉平衡树(AVL 树)?

3.1 AVL 树的定义

AVL 树是 自平衡的二叉查找树,满足:

  • 任意节点的左右子树高度差(平衡因子)不超过 1
  • 任何操作(插入、删除)后,AVL 树会进行 旋转调整 来维持平衡

平衡因子计算:

int height(TreeNode node) {
    return node == null ? 0 : Math.max(height(node.left), height(node.right)) + 1;
}

int getBalanceFactor(TreeNode node) {
    return node == null ? 0 : height(node.left) - height(node.right);
}

4. 二叉平衡树的旋转机制

4.1 旋转类型

AVL 树插入新节点后,若失去平衡,则通过 旋转(Rotation) 来恢复平衡。

  • LL(右旋):左子树太高
  • RR(左旋):右子树太高
  • LR(先左旋后右旋)
  • RL(先右旋后左旋)

4.2 右旋(LL 旋转)

TreeNode rightRotate(TreeNode y) {
    TreeNode x = y.left;
    y.left = x.right;
    x.right = y;
    return x;
}

4.3 左旋(RR 旋转)

TreeNode leftRotate(TreeNode x) {
    TreeNode y = x.right;
    x.right = y.left;
    y.left = x;
    return y;
}

5. 什么是红黑树?

5.1 红黑树的定义

红黑树(Red-Black Tree)是一种 自平衡二叉查找树,每个节点有一个 颜色属性(红或黑)

5.2 红黑树的规则

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点必须是黑色。
  3. 红色节点的子节点必须是黑色(不能有连续两个红色节点)。
  4. 从任意节点到叶子节点,黑色节点数必须相同。
  5. 新插入的节点默认为红色。

5.3 红黑树的旋转与调整

红黑树的插入可能破坏规则,因此需要:

  • 左旋(Right Rotation)
  • 右旋(Left Rotation)
  • 颜色变换(Recoloring)
void fixRedBlackTree(TreeNode node) {
    // 具体调整逻辑省略,涉及父节点、叔节点颜色判断
}

6. 结论

结构 是否有序 是否自平衡 平均查找时间
二叉树 O(n)
二叉查找树(BST) O(log n)(最坏 O(n))
AVL 树 O(log n)
红黑树 O(log n)
  • 二叉查找树(BST) 适合动态数据,但可能变得不平衡。
  • AVL 树 是高度平衡的 BST,查找效率高,但插入和删除的旋转操作较多。
  • 红黑树 牺牲了一点平衡性,但保持了较优的插入/删除性能。

就到这里吧!

你可能感兴趣的:(JAVA,数据结构,算法,java,树)