目录
树的基本概念
树的主要类型
树的常见操作
树(Tree)是一种非线性数据结构,用于表示具有层次关系的数据。树由节点(Node)组成,每个节点可以有零个或多个子节点。树结构在计算机科学中被广泛应用,例如二叉树、二叉搜索树、堆、Trie 树等。
1. 节点(Node):
- 树的最基本单位,每个节点包含数据和指向其子节点的引用。
2. 根节点(Root):
- 树的最顶层节点,没有父节点。
3. 父节点(Parent):
- 一个节点的上层节点。
4. 子节点(Child):
- 一个节点的下层节点。
5. 叶子节点(Leaf):
- 没有子节点的节点。
6. 路径(Path):
- 从一个节点到另一个节点的节点序列。
7. 深度(Depth):
- 从根节点到某个节点的路径长度。
8. 高度(Height):
- 从某个节点到其最远叶子节点的路径长度。树的高度是从根节点到最远叶子节点的路径长度。
9. 度(Degree):
- 一个节点的子节点数量。
10. 森林(Forest):
- 多棵不相交的树的集合。
1. 二叉树(Binary Tree):
- 每个节点最多有两个子节点(左子节点和右子节点)。
- 二叉树的特殊形式包括二叉搜索树、平衡二叉树、完全二叉树等。
2. 二叉搜索树(Binary Search Tree, BST):
- 每个节点的左子树中的所有节点的值都小于该节点的值。
- 每个节点的右子树中的所有节点的值都大于该节点的值。
- 常用于快速查找、插入和删除操作。
3. 堆(Heap):
- 一种特殊的完全二叉树,用于实现优先队列。
- 最大堆:父节点的值大于或等于其子节点的值。
- 最小堆:父节点的值小于或等于其子节点的值。
4. Trie 树(前缀树):
- 用于高效存储和检索字符串数据。
- 通过将具有相同前缀的字符串共享相同的路径来节省空间。
5. B树和B+树:
- 用于文件系统和数据库系统的索引结构。
- B树:每个节点可以有多个子节点,用于平衡树的高度。
- B+树:所有数据都存储在叶子节点上,叶子节点之间有指针连接。
1. 插入(Insert):
- 在树中添加一个新节点。
2. 删除(Delete):
- 从树中移除一个节点。
3. 查找(Search):
- 在树中查找一个特定的节点。
4. 遍历(Traversal):
- 访问树中的每个节点。常见的遍历方法有:
- 前序遍历(Pre-order):根节点 -> 左子树 -> 右子树
- 中序遍历(In-order):左子树 -> 根节点 -> 右子树
- 后序遍历(Post-order):左子树 -> 右子树 -> 根节点
- 层序遍历(Level-order):从上到下、从左到右逐层访问节点
本次基于前面已经实现过了堆(Heap)和字典树(Tire),我们后续简单模拟二叉搜索树、AVL树、红黑树:
public interface MyTree {
TreeNode getRoot();
TreeNode getNode(E value);
TreeNode insert(E value);
TreeNode delete(E value);
TreeNode find(E value);
TreeNode findMax();
TreeNode findMin();
boolean isEmpty();
void printTree();
}
public class TreeNode {
public Class> clazz;
public E value;
public TreeNode parent;
public TreeNode left;
public TreeNode right;
// AVL 树所需属性
public int height;
// 红黑树所需属性
public Color color = Color.RED;
public TreeNode(Class> clazz, E value, TreeNode parent, TreeNode left, TreeNode right) {
this.clazz = clazz;
this.value = value;
this.parent = parent;
this.left = left;
this.right = right;
}
public TreeNode(Class> clazz, E value, TreeNode parent, TreeNode left, TreeNode right, Color color) {
this(clazz, value, parent, left, right);
this.color = color;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (null == obj) return false;
if (this.getClass() != obj.getClass()) return false;
TreeNode node = (TreeNode) obj;
if (null == value) {
return node.value == null;
} else {
return node.value.equals(value);
}
}
// 红黑树枚举
enum Color {
RED, BLACK
}
}