【问题标题】:Height of a binary tree: why is this solution not passing 2/6 test cases in hackerrank?二叉树的高度:为什么这个解决方案没有通过hackerrank中的2/6测试用例?
【发布时间】:2023-03-16 10:15:01
【问题描述】:

为使用中序遍历的二叉搜索树的高度编写了递归解决方案。

每次函数到达“null”节点(行尾)时,它都会重置名为“numLevels”的变量。每次方法到达行尾,如果numLevels > finalVar,则finalVar变成numLevels。​​

这是我的解决方案:

 static int finalVar= 0;
    static int numLevels= 0; 
    
    public static int height(Node root) {
        // traverse (in order), ml++ with every recursive call, reset when node == null
        findHeight(root);
        
        if (finalVar-1 == 1) return 0;  // special case defined in instructions
        else{
              return finalVar-1;
        }
    }
    
    public static void findHeight(Node node){
        numLevels++;       // every time we recursive call, we add
        
        if (node == null){
            if (numLevels > finalVar){
                finalVar=numLevels;
            }
            numLevels=0;
            return;
        }
        findHeight(node.left);
        findHeight(node.right);
    }

以下是它没有通过的两个测试用例:

和:

所有其他测试用例都通过了。任何人都可以找出它不起作用的原因吗? :( 谢谢!

【问题讨论】:

  • 你的递归方法应该返回一个值。您不需要为此使用静态变量。

标签: java data-structures binary-tree binary-search-tree testcase


【解决方案1】:

只是吐口水,但不会将 numLevels 设置为 0 也会为另一个分支重置它吗?因为请记住,您的递归调用一直沿着最左边的分支向下,然后是最后一个左边的右边的分支。当时的 numLevels 为 0,永远不会大于另一个分支。

因为无论如何你都在创建一个辅助函数,所以没有理由使用静态变量。只需传递当前的最大值和计数,然后做同样的事情。这样,就递归深度而言,您当前的深度是“线程安全的”。

【讨论】:

  • 有道理!!谢谢你!必须使用静态变量,因为静态方法只能引用静态变量:(完全同意 numLevels 仅正确计算最左分支中的级别但我不知道何时重置 numLevels 如果不存在?
  • @SomeoneLearning17 重点是不要使用静态变量,而是将数据作为参数传递。所以你的新函数签名将是: public static void findHeight(Node node, int depth, int maxDepth);要回答您的第二个问题,请考虑您是否甚至需要手动将其“设置”为 0?当你递归转义时,你真的在​​上一个节点,对吗?如果你往下走,你会在深度上加 1。我相信你可以从那里推断出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多