找出克隆二叉树中的相同节点-LeetCode
1379. 找出克隆二叉树中的相同节点 - Find a Corresponding Node of a Binary Tree in a Clone of That Tree
🎯 问题描述(来源于LeetCode)
描述:
给定两棵二叉树 original 和 cloned,以及 original 中的一个目标节点 target。
已知 cloned 是 original 的一个深拷贝(即结构与节点值完全一致,但节点对象不同)。
请返回 cloned 中与 target 对应的节点。
说明:
original和cloned中的节点个数相同,且结构完全一致。target节点一定存在于original中。- 不允许对二叉树进行修改。
示例:
- 示例 1:
1 | 输入: original = [7,4,3,null,null,6,19], cloned = [7,4,3,null,null,6,19], target = 3 |
- 示例 2:
1 | 输入: original = [7], cloned = [7], target = 7 |
💻 解题思路
思路1:同步深度优先搜索(DFS)
算法步骤
-
递归终止条件:
- 如果
original为None,说明到达叶子节点的子节点,直接返回None(未找到)。
- 如果
-
检查当前节点:
- 如果
original就是target(注意比较的是节点对象,不是值),说明找到了目标节点,此时返回cloned(对应的克隆树节点)。
- 如果
-
递归搜索子树:
- 先在右子树中查找:
self.getTargetCopy(original.right, cloned.right, target)。 - 如果右子树找到(返回值不为
None),则直接返回;否则继续在左子树中查找。 - 用
or连接两次递归调用,因为or运算符会短路,先执行右子树,若返回非None则直接返回,否则计算左子树并返回其结果。
- 先在右子树中查找:
-
返回结果:
- 最终返回找到的节点(若未找到则返回
None,但题目保证一定存在)。
- 最终返回找到的节点(若未找到则返回
思路1:代码实现
1 | # Definition for a binary tree node. |
思路1:📊 性能分析
复杂度验证
- 时间复杂度:,其中 为二叉树的节点数。最坏情况下需要遍历所有节点(如目标节点在最深层)。
- 空间复杂度:,其中 为树的高度。递归调用栈的深度等于树高,最坏情况(链状树)为 。
思考
- 本题的关键是同步递归:每次递归都同时传入
original和cloned的对应节点,确保在原始树中找到target时,克隆树中处于相同位置的节点即为答案。 - 代码中先搜索右子树再搜索左子树,最终使用
or连接,写法简洁。也可以显式地用变量接收结果后判断,但or的短路特性使得代码更紧凑。 - 此题也可以使用**广度优先搜索(BFS,队列)**同步层序遍历,但 DFS 更直接。
- 注意比较
original is target(对象身份比较),而不是original.val == target.val,因为树中可能存在重复值。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






