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

Javascript 如何遍历两个相同的树并返回目标值?,javascript,binary-search-tree,Javascript,Binary Search Tree,有人能告诉我为什么console.log输出正确的答案,但是返回值为null吗 我尝试遍历两个相同的树,然后当在原始树的节点中找到目标值时,我尝试在克隆树中返回相同的节点值 我真的很感激你能提供的任何帮助 原始问题: 代码库: var getTargetCopy = function(original, cloned, target) { if(original === null) { return null } original.left =

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

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

我真的很感激你能提供的任何帮助

原始问题:

代码库:

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
输入:

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
控制台。日志:

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
输出:

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
所需答案:

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
一些问题:

  • 函数应该返回一个节点,而不是一个值,因此
    return cloned.val
    是错误的。它应该是
    返回克隆的

  • 使用以下语句可以对原始树进行变异:

    original.left = getTargetCopy(original.left, cloned.left, target)
    original.right = getTargetCopy(original.right, cloned.right, target)
    
    这不应该发生

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

  • 当您有一个匹配项时,您不必进行更深层次的递归,因此在执行递归调用之前执行此测试

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

  • 以下是您的代码更正:

    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);
    

    数据中的树在哪里?@NinaScholz这是二叉树节点的定义方式:函数TreeNode(val){This.val=val;This.left=This.right=null;}@NinaScholz我添加了指向我试图解决的leetcode问题的链接。感谢您的深入回答!我担心我不会得到任何解释,因为有人否决了这篇文章。你能帮助我理解当我克隆控制台日志时,为什么我得到一个数组而不是int?你没有得到数组,而是一个对象(用大括号显示)。int在
    cloned
    的属性中可用:
    cloned.val
    。能否详细说明此代码块的作用?“return getTargetCopy(original.left,cloned.left,target)| getTargetCopy(original.right,cloned.right,target)”是否正在遍历树?再次感谢你。