Skip to content

二叉树

Binary tree

每个节点至多有两个有序子节点的根树。

条目类型
模型

形式陈述

二叉树是有根有序的特化:每个节点至多有两个孩子,且区分左孩子与右孩子——仅有一个孩子时也必须指明它是左还是右。等价的递归定义:二叉树要么为空,要么由一个根、一棵左二叉子树与一棵右二叉子树组成。节点的深度是根到该节点的边数,高度是该节点到其子树中最深叶的边数。含 n 个节点的二叉树恰有 n1 条父子边,高度 h 满足

log2nhn1,

上界来自退化成链,下界因为高度为 h 的二叉树至多有 2h+11 个节点(等价地,L 层至多 2L1 个节点)。满二叉树要求每个内部节点恰有两个孩子;完全二叉树要求除最末层外逐层填满、末层从左连续填充。三种基本遍历序——先序、中序、后序——分别把根安排在左右子树之前、之间、之后递归输出。

直觉

二叉树是“二路递归分解”的形状:每个节点代表一次一分为二的决策或一个二元运算,整棵树是分解过程的完整记录。左右有别不是形式主义,两个方向通常承载不对称的语义——小与大、then 与 else、比特 01;抹掉左右之分就丢掉了这层信息。结构的平衡程度决定递归的深度:同样 n 个节点,均衡分裂给出对数高度,偏向一侧则退化为线性,搜索、堆与分治的效率差异几乎都能追溯到这一形状参数。空树作为合法基例并非多余:它让递归定义与递归算法的边界情形统一而简洁。

二叉树结构示意图
例子与边界

表达式 (a+b)c 的语法树以 为根,左子树是以 + 为根、叶为 a,b 的子树,右子树是叶 c;后序遍历输出 ab+c,恰为逆波兰记法,中序遍历配合括号还原中缀式。计数方面,3 个节点的二叉树形状恰有 5 种(四种链形加一种平衡形),一般地 n 个节点的形状数是 Catalan 数 Cn=(2nn)/(n+1)

边界处的区分最易出错。二叉树不是二叉搜索树:后者还要求键满足子树范围约束;也不是堆:堆另加形状与堆序不变量。“每个节点至多两个孩子的无序树”同样不是二叉树——根下只挂一个孩子时,“左独子”与“右独子”是两棵不同的二叉树,作为无序树却是同一棵;反过来,把无序树的孩子随手排成左右,会引入原本不存在的顺序信息。约定也需留意:本页取根深度为 0、单节点树高度为 0,而不同教材对空树高度取 1 或不定义,跨文献比较公式前应先对齐约定。

形状与键值也必须分层理解:同一组键可以放进许多不同二叉树形状,只有搜索树、堆等额外不变量才会排除其中一部分。满二叉树要求内部节点都有两个孩子,完全二叉树则只约束逐层填充次序;前者不必完全,后者的末层也可以尚未填满。固定高度 h 时,链形只需 h+1 个节点,而节点数上限为 2h+11,这正是同一高度下两种极端形状。

推论与应用

二叉树是一族核心结构的公共骨架:加上键序约束得到搜索树,加上形状与堆序约束得到二叉堆,按频率自底向上合并得到 Huffman 编码树,其中叶表示符号、根叶路径给出前缀码。Cartesian Tree同时固定数组的中序下标与堆序优先级,把区间最小值和树祖先结构接起来;它不是“任意二叉树再放一组键”,而是由两条序共同确定的专门表示。

遍历序还能把指针树翻译成序列:前序、中序和后序改变递归访问次序,广度优先搜索则给出层序;它们分别服务序列化、表达式求值与由遍历序重建树。平衡括号树表示按 DFS 进入/退出写下一对括号,并用括号匹配恢复父子与子树边界;简洁有序树在接近信息论下界的 bit 空间中为这些导航操作建立 rank/select 支持。这里改变的是表示与空间模型,不是二叉树的递归定义。编译器的抽象语法树分治递归树和比较决策树则继续使用同一形状承载不同语义;最后一种还把比较次数化为根叶路径长度,支撑比较排序下界。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,Chs. 1–6。
关系图谱28 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

类型化关系