LC每日一题|20240403 - 1379. 找出克隆二叉树中的相同节点
给你两棵二叉树,原始树
original和克隆树cloned,以及一个位于原始树original中的目标节点target。其中,克隆树
cloned是原始树original的一个 副本 。请找出在树
cloned中,与target相同 的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。注意: 你 不能 对两棵二叉树,以及
target节点进行更改。只能 返回对克隆树cloned中已有的节点的引用。
提示:
- 树中节点的数量范围为
[1, 104]。 - 同一棵树中,没有值相同的节点。
target节点是树original中的一个节点,并且不会是null。
进阶: 如果树中允许出现值相同的节点,将如何解答?
题目级别: Easy
这题不支持提交kt,所以只能用Java写了~
理解题目用了一点时间,因为我最开始没有意识到 original 有什么实际作用...
根据题目提示中所言,树中没有重复节点,那我们只需要把这棵树用我们喜欢的方式遍历一遍,找到值为 target.value 的节点返回就可以了,写个简单的DFS如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
return dfs(cloned, target.val);
}
public final TreeNode dfs(final TreeNode root, int target) {
if (root == null) return null;
if (root.val == target) return root;
TreeNode left = dfs(root.left, target);
if (left != null) return left;
TreeNode right = dfs(root.right, target);
if (right != null) return right;
return null;
}
}
original 不传,这题照样能做得出来~
问题出在了进阶中,如果树中有重复的节点,那么这种写法肯定就A不过去了,因为值是不可靠的。
当然解决的方案也很简单,只需要修改一下原有的判断 target.value == node.value 的逻辑就可以了。
我们可以把 original 带到递归里,让 clone 时刻是 original 的克隆就可以了。
怎么做?验 clone.left 的时候,传 original.left,反之亦然。
值不可靠了,但是引用还是可靠的。 当 target == original 的时候,说明我们已经遍历到了目标节点,直接返回 clone 即可~
(突然发现这题就本来应该这么写...
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
if (original == null) return null;
if (original == target) return cloned;
TreeNode left = getTargetCopy(original.left, cloned.left, target);
if (left != null) return left;
TreeNode right = getTargetCopy(original.right, cloned.right, target);
if (right != null) return right;
return null;
}
}
感觉这题哪怕是进阶了,也只能是个Easy...
感觉LC又在憋大招了TAT