用“棋盘格法”快速还原二叉树
约 1149 字大约 4 分钟
2026-09-14
二叉树笔试题里,如果给出 前序 + 中序 或 后序 + 中序,可以用一种很直观的“棋盘格法”快速还原二叉树。
核心想法很简单:
中序放横轴,负责确定左右位置;前序或倒序后的后序放纵轴,负责确定根节点出现顺序。
这套方法适合普通二叉树的两种情况:
- 前序 + 中序
- 后序 + 中序
前序 + 后序一般不能唯一确定普通二叉树。
核心思路
先记住三种遍历:
前序:根 → 左 → 右
中序:左 → 根 → 右
后序:左 → 右 → 根棋盘格里:
横轴 = 中序遍历
纵轴 = 根优先出现的顺序前序本身就是:
根 → 左 → 右所以可以直接作为纵轴。
后序是:
左 → 右 → 根根在最后,所以先倒过来:
根 → 右 → 左这样根节点就会优先出现。
中序最重要,因为:
左子树 | 根 | 右子树所以根节点在中序里的位置,会把当前子树直接切成左右两个区间。
前序 + 中序
例如:
前序:A B D E C
中序:D B E A C把中序横着写,前序竖着写:
中序
D B E A C
┌───┬───┬───┬───┬───┐
前 A │ │ │ │ A │ │
序 B │ │ B │ │ │ │
D │ D │ │ │ │ │
E │ │ │ E │ │ │
C │ │ │ │ │ C │
└───┴───┴───┴───┴───┘纵轴最先出现的是 A,所以 A 是根。
中序:
D B E | A | C因此:
A 的左子树区间:D B E
A 的右子树区间:C左边区间里,在前序中最先出现的是 B,所以 B 是左子树的根。
右边只有 C,所以 C 是右孩子。
再看 B:
D | B | E所以 D 是左孩子,E 是右孩子。
最终:
A
/ \
B C
/ \
D E这里最关键的一点是:
根节点左边的位置只能属于它的左子树,右边的位置只能属于它的右子树。
“属于左子树”不等于“就是左孩子”。
例如:
A
/
B
\
CC 仍然属于 A 的左子树,但它是 B 的右孩子。
后序 + 中序
例如:
后序:D E B C A
中序:D B E A C后序的根在最后,所以先倒过来:
倒序后序:A C B E D然后把中序放横轴,倒序后的后序放纵轴:
中序
D B E A C
┌───┬───┬───┬───┬───┐
倒 A │ │ │ │ A │ │
序 C │ │ │ │ │ C │
后 B │ │ B │ │ │ │
序 E │ │ │ E │ │ │
D │ D │ │ │ │ │
└───┴───┴───┴───┴───┘最上面的 A 是根。
中序仍然是:
D B E | A | C所以左边是 A 的左子树,右边是 A 的右子树。
倒序后序的顺序是:
根 → 右 → 左因此右子树区间中最先出现的是 C,左子树区间中最先出现的是 B。
最后得到的树还是:
A
/ \
B C
/ \
D E所以后序 + 中序和前序 + 中序的核心完全一样,只是后序需要先倒序,让根节点先出现。
连线时真正要遵守的规则
棋盘画出来以后,不能简单按“横坐标距离最近”连线。
真正的判断依据是 中序区间。
例如:
中序:D B E | A | CA 已经把左右区间分开。
所以 D、B、E 都属于 A 的左子树,C 属于 A 的右子树。
因此 C 不能连接 E,因为它们已经被 A 分到了不同的中序区间。
可以把连线逻辑理解成:
先看当前根能管辖的中序区间,
再看这个区间里纵轴最先出现的节点。也就是:
中序负责切区间
前序 / 倒序后序负责找区间里的根根节点优先连接下一层可用节点,但前提是这个节点还在自己的中序区间里,不能跨区间连接。
笔试时记这一套就够了
中序放横轴,负责定左右;
前序直接竖,后序倒着竖;
纵轴先出现的是根;
根左边进入左子树,右边进入右子树;
每次都在当前中序区间里继续找下一棵子树的根;
连线不能跨中序区间。可以再压缩成一句:
中序定左右,根序定层级,后序先倒置,连线不跨区。
这套方法本质上就是把“递归切分中序数组”的过程画成二维表格,特别适合笔试时手算。
