文章目录
- 📌 前言
- 一、 二叉树遍历序列的特殊关系与秒杀结论
- 1. 先序序列与后序序列正好相反
- 2. 先序序列与中序序列正好相反
- 3. 【必要补充】中序序列与后序序列正好相反
- 二、 核心公式、性质与概念避坑
- 1. 栈的跨界应用:卡特兰数(Catalan)公式
- 2. 完全二叉树的度数规律
- 3. 线索二叉树(Threaded Binary Tree)考点精髓
- 三、 经典真题题型推导与方法总结
- 🎯 题型一:受限高度的树形态计数问题
- 🔍 核心解题思路(基于根节点与子树拆解):
- 📐 最终答案:
- 🛠️ 方法总结 1:后序遍历的“祖先路径”特效
- 🌟 方法总结 2:树与栈的终极联动秒杀技(先序+中序的本质)
- 🔍 结语
📌 前言
在计算机专业研究生入学考试(408)中,数据结构的树与二叉树章节历来是选择题和大题的常客。本文基于一套考研高分冲刺笔记进行精细化排版与深度扩展,将二叉树的遍历序列特性、形态计数、线索化痛点以及“树与栈”的联动秒杀技巧进行系统性沉淀。
一、 二叉树遍历序列的特殊关系与秒杀结论
在选择题中,经常会给出某种遍历序列之间的特殊关系,要求反推二叉树的形态。以下是核心结论与深度互补:
1. 先序序列与后序序列正好相反
- 核心结论:该二叉树的每一层仅有一个节点。
- 形态特征:二叉树高度 $H = $ 节点总数n nn,即二叉树退化为单支树(类似于单链表结构)。
- 典型示例:
- 若先序序列为:A − B − C A - B - CA−B−C
- 后序序列为:C − B − A C - B - AC−B−A
- 此时树的形态只能是 A 只有某个孩子,B 只有某个孩子,全树无兄弟节点。
2. 先序序列与中序序列正好相反
- 核心结论:任一节点无右孩子(即只有左孩子)。
- 形态特征:整棵树向左下方倾斜。
3. 【必要补充】中序序列与后序序列正好相反
- 核心结论:任一节点无左孩子(即只有右孩子)。
- 形态特征:整棵树向右下方倾斜。
💡秒杀口诀:
- 先后相反⇒ \Rightarrow⇒每层一个(单支树)
- 先中相反⇒ \Rightarrow⇒无右孩子(一路向左)
- 中后相反⇒ \Rightarrow⇒无左孩子(一路向右)
二、 核心公式、性质与概念避坑
1. 栈的跨界应用:卡特兰数(Catalan)公式
当有n nn个不同的元素按某种顺序进栈时,其合法的出栈序列总数符合卡特兰数:
f ( n ) = 1 n + 1 C 2 n n = ( 2 n ) ! ( n + 1 ) ! n ! f(n) = \frac{1}{n+1} C_{2n}^n = \frac{(2n)!}{(n+1)!n!}f(n)=n+11C2nn=(n+1)!n!(2n)!
2. 完全二叉树的度数规律
- 性质结论:在完全二叉树中,度为 1 的节点数量(n 1 n_1n1)只能是 0 或 1。
- 原理解析:
- 若完全二叉树的节点总数n nn极为奇数,则没有度为 1 的节点(n 1 = 0 n_1 = 0n1=0)。
- 若完全二叉树的节点总数n nn极为偶数,则有且仅有一个度为 1 的节点(n 1 = 1 n_1 = 1n1=1),该节点即为最后一个叶子节点的双亲。
3. 线索二叉树(Threaded Binary Tree)考点精髓
- 后序线索树的后继痛点:在后序线索二叉树中查找某节点的后继节点时,如果该节点没有右线索,单纯依靠左右指针和线索是无法直接找到后继的,必须知道其双亲节点(Parent)。因此,后序线索树往往需要辅助栈或采用三叉链表结构。
- 线索的判定规则:哪些节点的右指针会演变成线索?
- 👉直接寻找树中没有右孩子的节点。这些节点的
rchild指针会指向其后继节点,且rtag == 1。
三、 经典真题题型推导与方法总结
🎯 题型一:受限高度的树形态计数问题
【题目】已知一棵二叉树的先序遍历序列为A B C D E ABCDEABCDE,且该树的高度不超过 3,问可能存在的二叉树形态有多少种?
🔍 核心解题思路(基于根节点与子树拆解):
- 确定根节点:由先序遍历(根-左-右)可知,A AA必然是全树的根节点。
- 子树规模分配:刨除根节点A AA后,剩余 4 个节点(B C D E BCDEBCDE)必须分配到A AA的左、右子树中。设左子树节点数为L LL,右子树节点数为R RR,则L + R = 4 L + R = 4L+R=4。
- 结合树高受限(高度≤ 3 \le 3≤3)分类讨论:
情况 A:【左 1 右 3】组合 (L = 1 , R = 3 L=1, R=3L=1,R=3)
左子树只有 1 个节点(必然是B BB),形态唯一。
右子树有 3 个节点(C D E CDECDE),且由于总树高不超过 3,右子树的高度不能超过 2。
先序为C D E CDECDE且高度不超过 2 的树,其根必然为C CC,剩余D E DEDE只能均匀分布或单侧排列。经过画图校验,为了使高度不超过 2,C CC必须有左右孩子(即左D DD右E EE)。
形态数:1 × 1 = 1 1 \times 1 = 11×1=1种。
情况 B:【左 3 右 1】组合 (L = 3 , R = 1 L=3, R=1L=3,R=1)
与情况 A 对称,左子树有 3 个节点(B C D BCDBCD),高度受限不超过 2;右子树只有 1 个节点(E EE)。
形态数:1 × 1 = 1 1 \times 1 = 11×1=1种。
情况 C:【左 2 右 2】组合 (L = 2 , R = 2 L=2, R=2L=2,R=2)
左子树 2 个节点(B C BCBC),右子树 2 个节点(D E DEDE)。
因为整体高度不能超过 3,而根节点已经占了 1层,所以左右子树的高度最高只能是 2 层。2 个节点的子树高度必然为 2。
对于 2 个节点的子树(例如B C BCBC,其中B BB为子树根),C CC可以作为B BB的左孩子或右孩子(共 2 种形态)。
同理,对于右子树D E DEDE(D DD为子树根),E EE可以作为D DD的左孩子或右孩子(共 2 种形态)。
根据乘法原理,该组合下的形态数为:
2 × 2 = 4 种 2 \times 2 = 4 \text{ 种}2×2=4种
📐 最终答案:
将所有合法情况的形态数相加:
1 + 1 + 4 = 6 种 1 + 1 + 4 = 6 \text{ 种}1+1+4=6种
🛠️ 方法总结 1:后序遍历的“祖先路径”特效
- 规律总结:通过二叉树的后序遍历(左-右-根),可以非常直观地找到某节点到其所有祖先节点的路径。
- 考场应用:在后序遍历过程中,当访问到节点X XX时,此时栈中存储的所有节点序列,恰好就是节点X XX的所有祖先节点。这一特性常用于解决“寻找最近公共祖先(LCA)”或“输出根节点到某节点路径”的算法大题。
- 示例说明:若后序遍历序列为A B C D E ABCDEABCDE,根据具体的树形态,在遍历到E EE时,其前面的有效活跃序列(仍在栈中未出栈的节点)便构成了通往E EE的祖先路径(如路径为C → D → E C \to D \to EC→D→E)。
🌟 方法总结 2:树与栈的终极联动秒杀技(先序+中序的本质)
- 传统做法:已知先序序列,判断哪个选项是合法的中序序列时,往往需要逐一尝试画树,耗时且极易出错。
- 秒杀核心:已知先序遍历序列,寻找能够与之一起构成二叉树的合法中序序列⇒ \Rightarrow⇒本质上就是求该先序序列的“合法出栈序列”。
- 操作口诀:“看作入栈序列”。
- 直接把题目中给出的先序序列看作是元素的入栈顺序(Push Order)。
- 题目选项中的各个中序序列看作是元素的出栈顺序(Pop Order)。
- 利用栈的“先进后出”基本规律(或者使用N NN个元素出栈的卡特兰数检验法、排列检验法),只要该中序序列是一个合法的出栈序列,那么它就必然能与该先序序列唯一确定一棵二叉树。
🔍 结语
通过将二叉树的拓扑结构转化为栈的线性存取,或者利用遍历序列的逆向对称性,可以把复杂的图论推导简化为几秒钟的代数运算。建议将上述三大秒杀口诀和出栈联动模型熟记于心,在 408 考场上做到“见题即秒杀”。