不确定为啥这个特定的测试用例不适用于合并二叉树

Posted

技术标签:

【中文标题】不确定为啥这个特定的测试用例不适用于合并二叉树【英文标题】:Unsure why this particular test case does not work for merging binary trees不确定为什么这个特定的测试用例不适用于合并二叉树 【发布时间】:2021-12-08 18:49:24 【问题描述】:

CS 学生在这里练习 leetcode。

我遇到了以下问题:

不知道这段代码好不好,也希望得到一些反馈,但这是我的结果:

class Solution 
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) 
    TreeNode ret = traverse(root1, root2);
    
    return ret;
    
    



public TreeNode traverse(TreeNode node1, TreeNode node2)
    TreeNode newNode = new TreeNode();
    
    if(node1 == null && node2 == null)
        return null;
    
    else if(node1 == null)
        newNode.val = node2.val;
    
    else if(node2 == null)
        newNode.val = node1.val;
    
    else
        newNode.val = node1.val + node2.val;
        newNode.left = traverse(node1.left, node2.left);
        newNode.right = traverse(node1.right, node2.right);
        
        
    
    
    return newNode;

似乎可以使用示例中给出的示例输入。但是,当我提交问题时,我遇到了这种情况:

当我根据我编写的代码在纸上计算出来时,我得到了预期的答案。我不确定为什么在这种情况下我的代码会产生错误的结果。帮帮我

编辑:为了清楚起见更改了措辞

【问题讨论】:

@kcsquared 抱歉!将编辑 【参考方案1】:

问题是您仅在两个节点都为空时才返回值,而不是在任何一个节点为空的其他情况下才返回值。您的代码不会针对“任何一个 null”情况执行 else 语句,它会返回到调用函数。

以下更改代码:

  if(node1 == null && node2 == null)
    return null;

else if(node1 == null)
    newNode.val = node2.val;
    return node2;

else if(node2 == null)
    newNode.val = node1.val;
    return node1;

else
    newNode.val = node1.val + node2.val;
    newNode.left = traverse(node1.left, node2.left);
    newNode.right = traverse(node1.right, node2.right);

因为newNode没有作用,所以可以直接丢弃合并到roo1节点中。

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) 
        if(root1 == null && root2 == null) 
            return null;
         else if(root1 == null) 
            return root2;
         else if (root2 == null) 
            return root1;
         else 
            root1.val = root1.val + root2.val;
            root1.left = mergeTrees(root1.left, root2.left);
            root1.right = mergeTrees(root1.right, root2.right);
        
        return root1;

这应该适合你。

【讨论】:

我不能说我明白。在任何 elseif/else 情况下,newNode 都会更新,然后返回 newNode。除非 node1 和 node2 都为 null,否则它应该返回带有适当子树的 newNode,除非我遗漏了什么。 您的代码在 2 种情况下正确运行 1. 当您的两个节点都为空时 2. 当您的两个节点都不为空时 您的代码对任何一方都不起作用 null 因为您没有返回而是退出. 在任何一种 null 情况下,总是返回你的 newNode 根,在这个用例中是 2。

以上是关于不确定为啥这个特定的测试用例不适用于合并二叉树的主要内容,如果未能解决你的问题,请参考以下文章

未通过所有测试用例的二叉树的最大路径

Math.floor 不适用于 cartian 测试用例

数组实现多叉树

笑话:返回 null 的测试用例。我尝试了差异解决方案,但不适用于我

问题在于平衡括号。我正在使用堆栈进行操作。它不适用于仅一个测试用例,即')'。否则它工作正常

装饰器适用于函数但不适用于类