题目描述
思路解析动画文字版
笨办法:把两棵树都按层序拍平成数组,再按下标相加。可二叉树有很多空洞,左右子树长度不一致时下标会错位,还会丢掉节点之间的引用关系。
树题更自然的是直接递归:merge(a,b) 只管当前这一个位置——a 空就返回 b,b 空就返回 a,两个都不空就把值加到 a 上,再递归合并左右孩子。
根节点:两边都在,1 + 2:从根开始。两个根都存在,走「相加」分支:把 root2 的值加到 root1 上,根值变成 3。
根变成 3,先递归左子树:根这一格处理完。代码下一句是先递归左子树,并把返回值接回 root1.left。根要等左右都接好才算 done。
左孩子:两边都在,3 + 1 = 4:左孩子两边都在,相加得 4。这个节点继续复用 root1 自己的节点,不新建。
左·左:5 配空,直接返回 5:走到「左的左」。这里只有 root1 的 5,root2 是空。一边空就短路:把非空那个 5 整支直接返回,不再往下拆。
左·右:空配 4,直接返回 4:「左的右」反过来:root1 空、root2 有 4。同样短路,返回 root2 的 4,由父亲接到左孩子的 right。
右孩子:两边都在,2 + 3 = 5:回到根,处理右孩子。两边都在,相加得 5,再继续递归它的左右孩子。
右·右:空配 7,直接返回 7:右孩子的「右的右」,只有 root2 的 7。又是短路:返回 7,接回结果树。
递归收束:左右都接回,返回根:递归像折纸一样回收:每个调用返回自己这一格的根,父亲接回 left 或 right。一层层接回来,整棵树就拼好了。
最终答案:[3,4,5,5,4,null,7]:层序读出来正好是样例输出 [3,4,5,5,4,null,7]。整道题原地复用 root1 的节点,没有多复制一棵树。
灵魂帧慢放:一空一非空,整支搬过来:把全题最关键的一刀慢放:当一边是空,另一边的子树整支直接搬过来。这一步既是终止条件,也是「保留非空节点」的本质——它让递归能停下来。
一句话记住本题:先定义返回值——合并后的根节点;空节点是递归地基,重叠节点才做局部相加。
边界三连:三种边界都被前两行空判断兜住了:先看最小规模,再看一边为空,最后看结构错位。
面试追问:把动画里的返回值定义、短路分支、复杂度推导讲成自己的话,追问就稳了。
本题的原子操作是「先处理当前节点、再分别递归左右」。掌握后去 树专题 把同款骨架刷一遍,不懂就问 AI 助教小欧。
参考代码
class Solution: def mergeTrees(self, root1, root2): if not root1: return root2 if not root2: return root1 root1.val += root2.val root1.left = self.mergeTrees(root1.left, root2.left) root1.right = self.mergeTrees(root1.right, root2.right) return root1复杂度
- 时间复杂度:O(min(m, n)),只在两棵树都非空的位置才继续递归;一旦一边为空就立即返回,所以访问的节点数受较小那棵树约束。
- 空间复杂度:O(min(m, n)),额外开销只有递归栈,最深等于重叠部分的树高;退化成链时最坏到 O(min(m, n))。
可套用的代码模板
三步骨架:①空节点终止 ②当前节点结算 ③递归左右并接回。横线处按题填——617 填「相加」,翻转题填「交换左右」,判相同题填「比较两值」。
def solve(a, b): # 1) 终止条件:处理空节点 if not a: return ____ # 617 里填 b if not b: return ____ # 617 里填 a # 2) 本层逻辑:在当前节点结算 ____ # 617 里填 a.val += b.val # 3) 递归左右,并把返回值接回去 a.left = solve(a.left, b.left) a.right = solve(a.right, b.right) return a # 返回合并后的根易错点
面试追问把动画讲成自己的话
追问递归函数的返回值到底是什么?
追问时间复杂度为什么是 O(min(m,n)) 而不是 O(m+n)?
追问能不能不改原树、不用递归?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
对称二叉树
LeetCode 101 · 简单 · 沿着 树 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题