给定一棵二叉树,检查它是否轴对称。一个常见的简化写法是按层收集非空值检查回文,但这会漏掉空位信息:本文用一个具体反例和 30,000 组随机树的穷举测试,证明这种写法会把 34% 的非对称树误判为对称,再给出正确的镜像递归和 5 种语言实现。
给定一棵二叉树,按层返回结点值,每层一个子数组。BFS 的一个常见陷阱是内层循环没有先固定这一层的结点数,导致所有层被合并成一个:本文用真实反例和完全二叉树验证这个错误,再给出正确写法和 5 种语言实现。
在层序遍历基础上,让每层交替从左到右、从右到左输出。一个常见陷阱是方向标记忘了在每层结束后切换,导致退化成普通层序遍历:本文用真实反例验证,再给出正确写法和 5 种语言实现。
给定一棵二叉树,求它的最大深度。一个常见陷阱是用栈做迭代 DFS 时,把访问过的结点总数误当成树的高度:本文用真实的完全二叉树规模对比验证这个错误会有多大偏差,再给出正确写法和 5 种语言实现。
给定前序遍历和中序遍历序列,重建这棵二叉树。一个真实会犯的错误是把两个参数顺序传反:本文用 2000 组随机树验证,超过一半的情况会直接崩溃,另外近三成会静静地重建出错误的树,再给出正确写法和 5 种语言实现。
给定中序遍历和后序遍历序列,重建这棵二叉树。一个真实会犯的错误是照搬前序定根的思路,误把 postorder[0] 当成根:本文用 2000 组随机树验证,超过一半的情况会直接崩溃,再给出正确写法和 5 种语言实现。
和层序遍历一样按层分组,只是结果要从下往上排列。一个常见陷阱是把所有结点拍平成一个数组再整体反转,这样会丢掉层的分组,还会误把每层内部的从左到右顺序也反转掉:本文用真实反例验证,再给出正确写法和 5 种语言实现。
给定升序数组,构造一棵高度平衡的二叉搜索树。一个常见陷阱是把数组按顺序插入 BST,这样虽然满足 BST 性质但完全不平衡,会退化成一条链:本文用真实的规模对比验证这个规律,再给出正确的取中点分治写法和 5 种语言实现。
给定升序链表,构造一棵高度平衡的二叉搜索树。一个真实会犯的错误是找到链表中点后忘了断开左半部分,导致递归永远看到同一段链表、无限递归崩溃:本文用真实反例验证,再给出正确写法和 5 种语言实现。
给定一棵二叉树,判断它是否高度平衡。一个常见陷阱是只检查根这一层的高度差,忽略了子树内部也要满足这个条件:本文用真实反例和 30000 组随机树验证,13% 的情况会被误判为平衡,再给出正确的 O(n) 写法和 5 种语言实现。
给定一棵二叉树,求它的最小深度。一个常见陷阱是照搬最大深度的写法直接 1+min(左,右),没有特判只有一侧孩子的情况:本文用真实反例和 30000 组随机树验证,62.5% 的树会给出错误答案,再给出正确写法和 5 种语言实现。
给定一棵二叉树和目标和,判断是否存在根到叶子的路径和恰好等于目标值。一个常见陷阱是累计和等于目标值就返回真,忘了要求当前结点必须是叶子:本文用真实反例和 2 万组随机测试验证,一半的情况会给出错误答案,再给出正确写法和 5 种语言实现。