繁体   English   中英

如何遍历两棵相同的树并返回目标值?

[英]How do I traverse two identical trees and return a target value?

有人能告诉我为什么 console.log 输出正确的答案,但是,返回输出 null?

我试图遍历两个相同的树,然后当在原始树的节点中找到目标值时,我试图在克隆树中返回相同的节点值。

我非常感谢您能提供的任何帮助。

原始问题: https : //leetcode.com/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/

代码库:

var getTargetCopy = function(original, cloned, target) {
    if(original === null) {
        return null
    }
    
    original.left = getTargetCopy(original.left, cloned.left, target)
    original.right = getTargetCopy(original.right, cloned.right, target)
    
    if(original.val === target.val) {
        console.log(cloned.val)
        return cloned.val
    }
};

输入:

Your input:
original = [7,4,3,null,null,6,19]
cloned = [7,4,3,null,null,6,19]
target.val = 3

控制台日志:

stdout:
3

输出:

Output:
null

想要的答案:

Expected:
3

一些问题:

  1. 该函数应该返回一个节点,而不是一个值,所以return cloned.val是错误的。 它应该return cloned

  2. 通过以下语句,您正在改变原始树:

     original.left = getTargetCopy(original.left, cloned.left, target) original.right = getTargetCopy(original.right, cloned.right, target)

    那不应该发生。

  3. 使用if(original.val === target.val)target.val不是唯一值时,您的代码可能会出现误报。 相反,您应该比较节点引用

  4. 当你有一个匹配时,你不应该更深入地递归,所以在进行递归调用之前执行这个测试。

  5. 当递归调用返回一个节点时,您应该立即返回节点,而不进行任何其他递归调用。

这是您更正的代码:

var getTargetCopy = function(original, cloned, target) {
    if(original === null) {
        return null
    }
    
    if(original === target) {
        return cloned;
    }

    return getTargetCopy(original.left, cloned.left, target)
            || getTargetCopy(original.right, cloned.right, target)
    
};

让它更简洁一点,它可以是:

var getTargetCopy = (original, cloned, target) =>
    !original || original === target 
        ? cloned
        : getTargetCopy(original.left, cloned.left, target)
          || getTargetCopy(original.right, cloned.right, target);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM