二叉树的高度:为什么这个解决方案在hackerrank中没有通过2/6的测试用例?

问题描述

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

每次函数到达“空”节点(行尾)时,它都会重置名为“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);
    }

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

test case 1

和:

enter image description here

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

解决方法

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

既然你正在制作一个辅助函数,就没有理由使用静态变量。只需传递当前的最大值和计数,然后做同样的事情。这样,就您的递归深度而言,您当前的深度是“线程安全的”。