往期链接
01 数组 | 02 链表 | 03 栈 | 04 队列 |
---|
写在前面:大“树”下好乘凉
定义
树(Tree)是一种非线性的层次化数据结构,由节点和连接节点的边组成。它模拟了一个倒置的树,根在顶部,分支向下延伸。
主要术语
- 节点(Node): 树中的基本单元,包含数据和指向其他节点的链接。
- 根节点(Root): 树的顶层节点,没有父节点。
- 父节点(Parent): 直接连接到其下层节点的节点。
- 子节点(Child): 直接连接到其上层节点的节点。
- 叶节点(Leaf): 没有子节点的节点。
- 内部节点(Internal Node): 至少有一个子节点的非叶节点。
- 兄弟节点(Siblings): 具有相同父节点的节点。
- 边(Edge): 连接两个节点的线。
- 路径(Path): 从一个节点到另一个节点的节点序列。
- 深度(Depth): 从根节点到特定节点的边的数量。
- 高度(Height): 从节点到其最远叶子节点的最长路径上的边的数量。
- 子树(Subtree): 由节点和其所有后代组成的树。
基本特征
- 层次结构: 树形结构天然地表示层次关系。
- 递归性: 每个子树本身也是一棵树。
- 无环: 树中不存在环路。
- 连通性: 任意两个节点之间有且仅有一条路径。
- n个节点的树有n-1条边。
- 动态性: 树结构可以方便地进行插入、删除操作。
主要应用领域:
- 文件系统: 操作系统中用于组织文件和目录。
- 数据库索引: B树和B+树用于实现高效的数据检索。
- 编译器设计: 抽象语法树用于表示程序的结构。
- 网络路由: 用于IP地址查找和数据包转发。
- 人工智能: 决策树用于分类和预测。
- 图形渲染: 场景图和BSP树用于3D图形渲染。
- 压缩算法: 哈夫曼树用于数据压缩。
- 搜索引擎: Trie树用于快速字符串匹配。
- XML/HTML解析: DOM树用于表示文档结构。
- 生物信息学: 用于表示生物分类和进化关系。
05 二叉树Binary tree
S1 说明
二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为"左子节点"和"右子节点"。二叉树的主要特点包括:
- 每个节点最多有两个子节点
- 左子节点通常表示小于父节点的值
- 右子节点通常表示大于或等于父节点的值
- 可以为空(称为空树)
二叉树的一些重要概念:
- 根节点:树的顶部节点
- 叶节点:没有子节点的节点
- 深度:从根到该节点的边的数量
- 高度:从该节点到最远叶节点的边的数量
S2 示例
import matplotlib.pyplot as plt
import networkx as nx
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self):
self.root = None
def insert(self, value):
if not self.root:
self.root = TreeNode(value)
else:
self._insert_recursive(self.root, value)
def _insert_recursive(self, node, value):
if value < node.value:
if node.left is None:
node.left = TreeNode(value)
else:
self._insert_recursive(node.left, value)
else:
if node.right is None:
node.right = TreeNode(value)
else:
self._insert_recursive(node.right, value)
def inorder_traversal(self):
result = []
self._inorder_recursive(self.root, result)
return result
def _inorder_recursive(self