# 1. 二叉树的前中后序遍历中递归与迭代(显式栈)实现,以及 Morris 遍历的 O(1) 空间原理? A Morris 遍历利用中序前驱的空右指针做线索,实现 O(1) 空间 ✓ 正确答案 B Morris 遍历需要 O(n) 栈空间 C 迭代后序遍历比前序简单 D 递归无法实现中序遍历
# 2. 二叉树的最近公共祖先(LCA)中普通二叉树递归解法与 BST 利用有序性的差异? A BST 也必须全树搜索 B 普通二叉树用后序递归归并,BST 用值比较定向到 O(height) ✓ 正确答案 C 普通二叉树 LCA 是 O(height) D 两者算法完全相同
# 3. 二叉树的层序遍历及其变体(之字形、右视图、每层最大值)的统一 BFS 模板? A 之字形是层序的逆序 B 不用 size 也能区分层 C 右视图取每层第一个节点 D 用当前队列 size 固定每层边界,变体只在层内处理上微调 ✓ 正确答案
# 4. 二叉树的最大路径和(LeetCode 124)中节点贡献值要取 max(0, 子节点贡献),全局答案如何在后序遍历中更新? A 子节点贡献取 max(0,...) 允许路径跳过负贡献子树,后序更新全局答案 ✓ 正确答案 B 贡献值必须包含两侧子节点 C 取 max(0,...) 会漏掉负值 D 全局答案在前序更新
# 5. 验证二叉搜索树中为什么"只比较父子节点"是经典错误?上下界递归与中序遍历两种正解? A 中序遍历不递增也合法 B 只比较父子节点即可 C 只比较父子节点会漏掉跨层约束,需用上下界递归或中序遍历递增验证 ✓ 正确答案 D 上下界递归无法处理全局约束
# 6. 二叉树的遍历变体中前序+中序重建、Morris 遍历 O(1) 空间的原理? A 前序+后序总能唯一重建 B 前序第一个是根,中序定位根确定左右子树大小后递归重建 ✓ 正确答案 C 中序第一个是根 D Morris 遍历需要 O(n) 栈
# 7. 二叉搜索树转排序双向链表(LeetCode 426)中如何用中序遍历维护前驱指针,原地转换的空间复杂度? A 需要申请新节点 B 中序遍历有序,用 prev 指针连接相邻节点,复用 left/right 原地转换 ✓ 正确答案 C 空间复杂度一定为 O(1) D 前序遍历也能得到有序序列
# 8. 二叉树的最大深度(LeetCode 104)中递归(1+max(左右))、迭代 BFS 与迭代 DFS 三种写法? A 三种写法复杂度不同 B 迭代只能用 BFS 一种 C 递归深度无栈溢出风险 D 递归 1+max(左右),迭代 BFS 按层计数,迭代 DFS 用栈存深度 ✓ 正确答案
# 9. 二叉树层序遍历如何区分"每层输出"与"整体输出"两种模式? A 两种模式实现完全相同 B 整体输出也必须用 size C 每层输出需在进入每层时记录 size 分隔层,整体输出无需分隔 ✓ 正确答案 D 每层输出无法用 BFS
# 10. 二叉树的序列化与反序列化(前序+null 标记 vs 层序)的设计取舍? A 普通前序无 null 也能唯一重建 B 前序+null 标记与层序+null 都能唯一重建,null 标记保证形状唯一 ✓ 正确答案 C 层序序列化不需要 null D 前序与层序都无法唯一重建
# 11. 平衡二叉树判断与二叉树直径中如何在一次后序遍历中同时求高度并判断/累积答案? A 两者都可在一次后序遍历中同时求子树高度并判断/累积答案 ✓ 正确答案 B 平衡判断看左右高度和 C 直径看左右高度差 D 需要两次遍历
# 12. 完全二叉树的节点个数(LeetCode 222)中如何用左右子树高度判断满树,使复杂度降到 O(log^2 n)? A 左右子树高度相等则左子树满可公式算,每层只递归一侧,复杂度 O(log² n) ✓ 正确答案 B 需要遍历所有节点 O(n) C 左右子树高度不等则左子树满 D 复杂度为 O(log n)
# 14. 二叉树的最小深度(LeetCode 111)中为什么必须遇到叶子节点才结算深度,与最大深度的对称写法陷阱? A 可像最大深度一样直接取 min B 必须遇到叶子才结算,单侧 null 时不能简单取 min(否则 null 侧 0 导致错误) ✓ 正确答案 C 空节点的深度为 1 D 单侧 null 时深度为 0
# 15. 路径总和(LeetCode 112/113)中递归减去当前节点值并在叶子处判断,记录路径的回溯写法如何撤销选择? A 在非叶子节点判断即可 B 记录路径无需撤销 C 递归减去节点值并在叶子判断,记录路径需在递归返回时撤销最后加入的节点 ✓ 正确答案 D 路径列表可共享无需拷贝
# 16. 二叉树的所有路径(LeetCode 257)中先序遍历携带路径字符串,回溯时如何正确拼接与撤销? A 用不可变字符串参数传递路径则各分支独立、无需撤销 ✓ 正确答案 B 用可变列表也无需撤销 C 路径拼接应在到达根时进行 D 后序遍历才能得到正确路径
# 17. 二叉树的最大宽度(LeetCode 662)中层序遍历时为每层节点按下标编号,如何用“当前下标-最左下标”计算宽度? A 无需下标编号 B 宽度等于每层节点数 C 按完全二叉树下标编号,宽度 = 每层最右-最左下标 +1,含中间空位 ✓ 正确答案 D 下标不会溢出
# 18. 二叉搜索树中的插入与删除(LeetCode 701/450)中删除分无子/单子/双子三种情况,双子为何用前驱或后继替换? A 前驱或后继可能有两个孩子 B 双子节点直接删除即可 C 双子用前驱/后继值替换后递归删除,把双子问题降为单子/无子 ✓ 正确答案 D 无子节点需用孩子顶替
# 19. 最近公共祖先(LCA)中递归法、父指针法、RMQ 法各自的复杂度与适用场景? A 倍增法查询 O(n) B 递归法单次 O(n),RMQ 预处理后 O(1) 查询,适合大量查询 ✓ 正确答案 C 父指针法 O(1) 查询 D RMQ 预处理 O(n) 空间
# 20. 判断一棵树是否为二叉搜索树,中序递增法 vs 区间约束递归法的边界差异? A 区间法上下界用 Integer.MAX/MIN 即可 B 中序法允许相等 C 中序法靠全局递增连续性,区间法靠逐层区间约束,都需处理重复值与整型边界 ✓ 正确答案 D 两种方法完全等价且无边界差异
# 21. 修剪二叉搜索树(LeetCode 669)中递归返回裁剪后的子树,如何处理节点值越界的三种分支? A 越界时需同时裁剪两侧 B 节点值越界时只需裁剪一侧(BST 单调性),递归返回裁剪后的子树 ✓ 正确答案 C 值小于 low 时保留左子树 D 无法保持 BST 结构