LeetCode-Py 项目解析:二叉树基础概念详解
1. 树结构基础概念
树(Tree)是一种非常重要的非线性数据结构,它由 n(n ≥ 0)个有限节点组成一个具有层次关系的集合。在计算机科学中,树结构被广泛应用于各种场景,如文件系统、数据库索引、网络路由等。
1.1 树的定义与特点
树结构具有以下核心特征:
- 每个树有且仅有一个根节点(Root),它是唯一没有前驱的节点
- 除根节点外,每个节点有且仅有一个直接前驱(父节点)
- 每个节点可以有零个或多个直接后继(子节点)
- 树中没有环路(即不存在从某个节点出发沿着子节点指针又回到自身的路径)
1.2 树的基本术语
理解树结构需要掌握以下专业术语:
节点相关术语:
- 度(Degree):一个节点拥有的子树数量
- 叶子节点(Leaf):度为0的节点,即没有子节点的节点
- 分支节点(Branch):度不为0的节点
- 树的度:树中所有节点度的最大值
层次相关术语:
- 层次(Level):根节点为第1层,其子节点为第2层,依此类推
- 深度(Depth):从根节点到该节点的最长路径上的边数
- 高度(Height):从该节点到叶子节点的最长路径上的边数
- 树的高度:根节点的高度
关系相关术语:
- 父节点(Parent):直接上级节点
- 子节点(Child):直接下级节点
- 兄弟节点(Sibling):具有相同父节点的节点
- 祖先节点(Ancestor):从根到该节点路径上的所有节点
- 后代节点(Descendant):该节点子树中的所有节点
2. 二叉树详解
2.1 二叉树的基本概念
二叉树(Binary Tree)是树结构中最基础也最重要的类型,它具有以下特点:
- 每个节点最多有两个子节点,分别称为左子节点和右子节点
- 子节点有明确的左右顺序之分,不能随意交换
- 即使某节点只有一个子节点,也要明确它是左子节点还是右子节点
二叉树有五种基本形态:
- 空树
- 只有根节点
- 根节点+左子树
- 根节点+右子树
- 根节点+左右子树
2.2 特殊类型的二叉树
2.2.1 满二叉树
满二叉树(Full Binary Tree)是指:
- 所有非叶子节点都有两个子节点
- 所有叶子节点都在同一层
- 深度为k的满二叉树有2^k-1个节点
满二叉树的一个重要性质是:对于编号为i的节点:
- 左子节点编号为2i
- 右子节点编号为2i+1
- 父节点编号为⌊i/2⌋
2.2.2 完全二叉树
完全二叉树(Complete Binary Tree)是指:
- 除了最后一层外,其他各层节点数都达到最大值
- 最后一层的节点都连续集中在最左边
- 深度为k的完全二叉树至少有2^(k-1)个节点,最多有2^k-1个节点
完全二叉树常用于实现堆结构,其特点是可以用数组高效存储,且不会浪费空间。
2.2.3 二叉搜索树
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,满足:
- 左子树所有节点的值都小于根节点的值
- 右子树所有节点的值都大于根节点的值
- 左右子树也都是二叉搜索树
BST的优势在于查找、插入和删除操作的平均时间复杂度都是O(log n)。
2.2.4 平衡二叉搜索树
平衡二叉搜索树(Balanced BST)是BST的改进版本,要求:
- 任意节点的左右子树高度差不超过1
- AVL树是最早的自平衡二叉搜索树
- 平衡树保证了操作的最坏时间复杂度也是O(log n)
2.3 二叉树的存储方式
2.3.1 顺序存储结构
顺序存储使用数组来存储二叉树节点,按照层次遍历的顺序存放:
- 对于完全二叉树非常高效
- 非完全二叉树会浪费空间(需要存储空节点)
- 节点i的左子节点在2i+1,右子节点在2i+2
- 父节点在⌊(i-1)/2⌋
2.3.2 链式存储结构
链式存储使用节点对象和指针来构建二叉树:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val # 节点值
self.left = left # 左子节点
self.right = right # 右子节点
链式存储的优点:
- 灵活,不浪费空间
- 插入删除操作方便
- 适用于各种形态的二叉树
3. 二叉树的应用
二叉树在算法和数据结构中应用广泛:
- 二叉搜索树用于高效查找
- 堆(完全二叉树)用于优先队列
- 哈夫曼树用于数据压缩
- 表达式树用于编译器设计
- 决策树用于机器学习
理解二叉树的基本概念和特性,是学习更复杂树结构(如B树、红黑树等)的基础,也是解决许多算法问题的关键。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考