本页面介绍 TheAlgorithms/Java 仓库中实现的树形数据结构。树是一种分层数据结构,其中元素(节点)通过边连接,每个节点最多有一个父节点,并可能拥有多个子节点。树形数据结构是计算机科学中的基础概念,为数据组织、搜索和操作提供了高效的解决方案。
有关一般数据结构信息,请参阅数据结构;有关堆(一种特殊树)等具体实现,请参阅堆实现。
树是一种由节点通过边连接组成的分层数据结构。一些关键术语:
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。本仓库中的BinaryTree实现提供了一个标准的二叉树,具有节点管理和遍历功能。
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java
BinaryTree类包含以下关键操作:
| 操作 | 描述 | 时间复杂度 |
|---|---|---|
find(int key) | 查找具有指定键的节点,或返回它将要插入的父节点 | O(log n) 平均,O(n) 最坏 |
put(int value) | 向树中插入一个新值 | O(log n) 平均,O(n) 最坏 |
remove(int value) | 从树中删除一个值 | O(log n) 平均,O(n) 最坏 |
findSuccessor(Node n) | 查找节点的中序后继 | O(log n) 平均,O(n) 最坏 |
BinaryTree类支持四种遍历方法:
inOrder):先访问左子树,然后是根节点,最后是右子树preOrder):先访问根节点,然后是左子树,最后是右子树postOrder):先访问左子树,然后是右子树,最后是根节点bfs):使用队列进行逐层遍历对于这棵树:
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java262-329
自平衡树自动调整其结构以保持某些属性,从而保证效率。该仓库包含两种自平衡二叉搜索树的实现。
红黑树是一种自平衡二叉搜索树,每个节点都有一个额外的颜色属性(红色或黑色)。这些树通过一系列属性和重新着色/旋转操作来保持平衡。
红黑树的属性
来源:src/main/java/com/thealgorithms/datastructures/trees/RedBlackBST.java
RedBlackBST实现包括:
主要方法包括
fixTree():插入后恢复红黑树属性rotateLeft() 和 rotateRight():旋转操作transplant():用一个子树替换另一个子树deleteFixup():删除后恢复红黑树属性来源:src/main/java/com/thealgorithms/datastructures/trees/RedBlackBST.java137-162 src/main/java/com/thealgorithms/datastructures/trees/RedBlackBST.java162-186
AVL树(以发明者 Adelson-Velsky 和 Landis 命名)是一种自平衡二叉搜索树,它保持高度平衡属性:对于每个节点,其左子树和右子树的高度差最多为1。
来源:src/main/java/com/thealgorithms/datastructures/trees/AVLSimple.java
AVLSimple实现包括:
来源:src/main/java/com/thealgorithms/datastructures/trees/AVLSimple.java125-145
该仓库还包括用于高效解决特定问题的专用树形数据结构。
线段树是一种用于存储区间或线段的树形数据结构,可对数组的区间进行高效查询。它特别适用于范围查询,例如查找特定范围内的最小值、最大值、总和或最大公约数。
来源:src/main/java/com/thealgorithms/datastructures/trees/SegmentTree.java
SegmentTree实现包括:
SegmentTree类包含以下关键方法:
constructTree():创建线段树updateTree():更新线段树中的值getSumTree():获取一个范围内的元素总和来源:src/main/java/com/thealgorithms/datastructures/trees/SegmentTree.java22-31 src/main/java/com/thealgorithms/datastructures/trees/SegmentTree.java35-46 src/main/java/com/thealgorithms/datastructures/trees/SegmentTree.java61-72
树状数组或二叉索引树是一种数据结构,可以高效地更新元素并计算数字表中的前缀和。
来源:src/main/java/com/thealgorithms/datastructures/trees/FenwickTree.java
FenwickTree实现包括:
FenwickTree类包含以下关键方法:
update(i, val):在索引i处添加值query(i):返回从索引0到索引i的元素总和该实现使用位操作技术高效地遍历树:
i += i & (-i):在更新操作中移动到下一个元素i -= i & (-i):在查询操作中移动到下一个元素来源:src/main/java/com/thealgorithms/datastructures/trees/FenwickTree.java14-34
| 树类型 | 优点 | 缺点 | 最佳用例 |
|---|---|---|---|
| 二叉树 | 实现简单 | 无平衡保证 | 基本分层数据表示 |
| 红黑树 | 保证O(log n)操作 | 实现复杂 | 数据库索引,Java的TreeMap和TreeSet |
| AVL 树 | 严格平衡以实现最佳搜索 | 插入/删除时旋转成本更高 | 查找密集型应用 |
| 线段树 | 快速范围查询 | 更高的空间复杂度 | 范围查询问题(最小值、最大值、总和等) |
| Fenwick 树 | 高效的更新和查询 | 仅限于前缀和类型查询 | 累积频率表、范围和查询 |
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java src/main/java/com/thealgorithms/datastructures/trees/RedBlackBST.java src/main/java/com/thealgorithms/datastructures/trees/AVLSimple.java src/main/java/com/thealgorithms/datastructures/trees/SegmentTree.java src/main/java/com/thealgorithms/datastructures/trees/FenwickTree.java
各种遍历方法可用于按特定顺序访问树中的节点
对于这棵树:
| 遍历方法 | 顺序 | 实现 |
|---|---|---|
| 中序遍历 | 4, 2, 5, 1, 6, 3, 7 | inOrder() |
| 前序遍历 | 1, 2, 4, 5, 3, 6, 7 | preOrder() |
| 后序遍历 | 4, 5, 2, 6, 7, 3, 1 | postOrder() |
| 广度优先遍历 | 1, 2, 3, 4, 5, 6, 7 | bfs() |
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java262-329
实现树形数据结构时,请考虑:
来源:src/main/java/com/thealgorithms/datastructures/trees/BinaryTree.java src/main/java/com/thealgorithms/datastructures/trees/RedBlackBST.java src/main/java/com/thealgorithms/datastructures/trees/AVLSimple.java