LC每日一题|20240403 - 1379. 找出克隆二叉树中的相同节点

107 阅读2分钟

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