使用静态变量打破递归

时间:2018-12-25 13:05:41

标签: java recursion static-variables

目标:查找树是否是平衡的二叉树。

我已经实现了一个可以正常工作的程序,但是希望通过防止不必要的递归来使其更加高效。为此,我使用了一个静态变量,该变量在一个条件被评估为false时设置,以便在进行任何自己的递归调用之前,所有其他递归调用都返回。

static int shouldIExit=0;
public boolean isBalanced(TreeNode root) {
    if(root==null){
        return true;
    }
    if(shouldIExit==1 || Math.abs(height(root.left)-height(root.right))>1){
        height(root.right))>1: "+ (Math.abs(height(root.left)-height(root.right))>1) ) ;
        shouldIExit=1;
        return false;
    }
    else{
     return (isBalanced(root.left) && isBalanced(root.right) );   
    }
}

问题在于即使没有条件导致静态变量被设置为某种方式。也就是说,即使对应的if条件的计算结果不为true,也应该将IEdIExit设置为1。

这是我不了解静态变量的工作原理吗?

1 个答案:

答案 0 :(得分:2)

您不需要static变量。在递归方法中使用非局部变量(static或实例变量)通常是一个坏习惯。

public boolean isBalanced(TreeNode root) {
    if(root==null) {
        return true;
    }
    if(Math.abs(height(root.left)-height(root.right))>1) {
        return false;
    } else{
     return (isBalanced(root.left) && isBalanced(root.right) );
    }
}

如果结合使用heightisBalanced的逻辑,则可以节省一些工作。我相信类似的方法应该起作用:

public boolean isBalanced (TreeNode root) {
    return balancedHeight(root) >= 0;
}

public int balancedHeight (TreeNode root) {
    if (root == null) {
        return 0; // an empty tree is balanced
    }
    int left = balancedHeight(root.left);
    if (left < 0) {
        return -1; // left sub-tree is not balanced, so entire tree is not balanced
    }
    int right = balancedHeight(root.right);
    if (left == right) { // the tree is balanced if both sub-trees are balanced 
                         // and both have same height
        return left + 1;
    } else {
        return -1; // tree is not balanced - either the right sub-tree is not
                   // balanced or the two sub-trees have different heights
    }
}