引言
树(Tree)是一种常见的非线性数据结构,由节点(Node)和边(Edge)组成,用于模拟具有层次关系的数据。树的应用非常广泛,包括文件系统、数据库索引、网络路由等。本文将详细介绍树的基本概念、定义和类型,以及树的基本操作,如插入、删除和查找。
树的定义和类型
树的定义
树是一种递归数据结构,由一个根节点(Root)及若干子节点组成。每个节点包含一个值,并通过边与其他节点相连。树的顶点称为根节点(Root Node),而没有子节点的节点称为叶节点(Leaf Node)。
Root
/ \
Child 1 Child 2
/ \ \
Leaf1 Leaf2 Leaf3
树的类型
树的类型多种多样,常见的包括二叉树(Binary Tree)、AVL树(AVL Tree)、红黑树(Red-Black Tree)等。
二叉树(Binary Tree)
二叉树是每个节点最多有两个子节点的树结构,通常称为左子节点和右子节点。二叉树分为完全二叉树和满二叉树。
- 完全二叉树:除最后一层外,所有层的节点都达到最大数量,并且最后一层的节点尽可能左对齐。
- 满二叉树:所有层的节点数量都达到最大值,即每个节点都有两个子节点,除了叶节点。
Root
/ \
Left Right
/ \ / \
LL LR RL RR
AVL树(AVL Tree)
AVL树是一种自平衡二叉查找树,其任意节点的两个子树的高度差不超过1。通过旋转操作来保持平衡,插入和删除操作的时间复杂度为 (O(\log n))。
红黑树(Red-Black Tree)
红黑树是一种自平衡二叉查找树,每个节点都有颜色属性,分别为红色或黑色。通过颜色属性及相应规则来保持平衡,确保插入、删除和查找操作的时间复杂度为 (O(\log n))。
树的其他类型
除了上述常见的树结构外,还有多叉树(M-ary Tree)、B树(B-Tree)、B+树(B+ Tree)等,用于不同的应用场景。
树的基本操作
插入操作
插入操作是向树中添加一个新节点。在二叉查找树中,插入操作根据新节点的值与当前节点的值比较,决定插入左子树或右子树。以下是二叉查找树的插入操作代码示例:
class TreeNode {
int value;
TreeNode left, right;
// 构造函数
TreeNode(int item) {
value = item;
left = right = null;
}
}
class BinaryTree {
TreeNode root;
BinaryTree() {
root = null;
}
// 插入值到二叉查找树
void insert(int value) {
root = insertRec(root, value);
}
// 递归方式插入值
TreeNode insertRec(TreeNode root, int value) {
if (root == null) {
root = new TreeNode(value);
return root;
}
if (value < root.value)
root.left = insertRec(root.left, value);
else if (value > root.value)
root.right = insertRec(root.right, value);
return root;
}
// 中序遍历打印树
void inorder() {
inorderRec(root);
}
void inorderRec(TreeNode root) {
if (root != null) {
inorderRec(root.left);
System.out.print(root.value + " ");
inorderRec(root.right);
}
}
// 测试插入操作
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
tree.insert(50);
tree.insert(30);
tree.insert(20);
tree.insert(40);
tree.insert(70);
tree.insert(60);
tree.insert(80);
// 打印插入后的树
tree.inorder(); // 输出:20 30 40 50 60 70 80
}
}
插入操作图解
- 初始化一个空树。
- 插入第一个值
50,成为根节点。 - 插入值
30,比50小,插入到50的左子树。 - 插入值
20,比30小,插入到30的左子树。 - 插入值
40,比30大,插入到30的右子树。 - 插入值
70,比50大,插入到50的右子树。 - 插入值
60,比70小,插入到70的左子树。 - 插入值
80,比70大,插入到70的右子树。
50
/ \
30 70
/ \ / \
20 40 60 80


3565

被折叠的 条评论
为什么被折叠?



