二叉树(Binary Tree) 是一种非常重要的非线性数据结构,每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的特点如下:
结构定义:
- 节点(Node):二叉树中的每个元素被称为节点,每个节点包含一个值(也可以是数据对象)和两个指向子节点的指针,通常标记为
left
和right
。 - 空树:当二叉树没有任何节点时,称为空树。
- 子树:每个节点的左子树和右子树也都是二叉树。
特性:
- 度:节点拥有的子节点数称为节点的度,二叉树的节点度最大为2。
- 叶子节点或终端节点:度为0的节点,即没有子节点的节点。
- 树的度:二叉树中各节点度的最大值。
- 层次:根节点的层次为0,其子节点为1层,依此类推。
- 深度:二叉树中节点的最大层次数,即树的深度。
分类:
- 满二叉树(Full Binary Tree):所有层都被完全填满,所有节点都有两个子节点或没有子节点。
- 完全二叉树(Complete Binary Tree):除了最后一层外,每一层都被完全填满,且最后一层的所有节点都尽可能地靠左排列。
- 平衡二叉树(Balanced Binary Tree):左右两个子树的高度差不超过1,例如AVL树和红黑树。
常见操作:
- 插入节点:将新节点添加到合适的位置,保持二叉树的结构。
- 删除节点:从二叉树中移除指定节点,并调整树结构。
- 查找节点:根据节点的值查找节点在树中的位置。
- 遍历:
- 前序遍历(Root-Less-Right):先访问根节点,然后左子树,最后右子树。
- 中序遍历(Left-Root-Right):先访问左子树,然后根节点,最后右子树。
- 后序遍历(Left-Right-Root):先访问左子树,然后右子树,最后根节点。
- 层次遍历(也称广度优先遍历,Level Order Traversal):按层次从左到右遍历所有节点。
应用场景:
- 搜索与查找:例如二叉搜索树(BST),每个节点的值都大于其左子树中的任何一个节点的值,并小于其右子树中的任何一个节点的值。
- ** Huffman 编码**:构建Huffman树,用于数据压缩。
- 堆(Heap):完全二叉树结构用于优先队列实现。
存储方式:
- 链式存储:每个节点通过指针指向其子节点。
- 顺序存储:对于完全二叉树,可以采用数组实现,利用数组下标与二叉树层级和节点位置的关系进行高效存储和访问。
时间复杂度:
- 插入和删除操作:在普通二叉树中,最坏情况下可能需要遍历完整棵树,时间复杂度为O(n);而在平衡二叉搜索树中,通过保持树的平衡性,这些操作的时间复杂度可以维持在O(log n)级别。
- 查找操作:在二叉搜索树中,查找时间复杂度为O(log n)(最优情况),在最坏情况下仍可能是O(n)。在普通二叉树中查找的时间复杂度也为O(n)。