0

このコードは、バイナリ ツリーが最小ヒープかどうかを調べるためのものですNullPointerException。パブリック スタティック ブール値 isMinHeap の 3 番目の if ステートメントで引き続き発生します。コードが有効だと思っていたので、なぜこの例外が発生し続けるのかわかりません上記の休憩のため。

public class ArrayHeapChecker {
public static boolean isBinaryTree(Integer[] array) {
    for (int i = 1; i < array.length; i++){
        if (array[i] != null && array [(i-1)/ 2] == null)   {
            return false;
        }
    }
    return true;
}
public static boolean isCompleteBinaryTree(Integer[] array) {
    if(!isBinaryTree(array)) {
        return false;
    }

    for (int i = 0; i < array.length - 1; i++)  {
        if ((i % 2 == 0) && array[i] == null && array[i + 1] != null)   {
            return false;
        }
        if ((i % 2 != 0) && array[i] == null && array[i + 1] != null)   {
            return false;
        }
    }

    return true;
}
public static boolean isMinHeap(Integer[] array) {
    if(!isCompleteBinaryTree(array)) {
        return false;
    }
    for (int i = 0; i < array.length - 1; i++)  {
        if (array[i] == null)   {
            break;
        }
        if (array.length <= ((2*i) + 2))    {
            break;
        }
        if (array[(i * 2) + 1] == null || array[(i * 2) + 2] == null)   {
            break;
        }
        if (array[i] > array[(i * 2) + 1] || array[i] > array[(i * 2) + 2]) {
            return false;
        }
    }
    return true;
}
}
4

1 に答える 1

0

あなたの要素がそうではないことを確認してarrayいませんnullarray[i] != null && array [(i-1)/ 2] == nullでは次の項目のみをチェックしていますArrayHeapChecker#isBinaryTreeIntegerと を比較すると、NPE から保護されませんnull。たとえば、コードは次の入力で失敗します: new Integer[]{1, 2, 3, 4, 5, 6, null}. 要件によって異なりますが、チェックが十分に厳密ではないため、修正はお勧めしません。

より正確に言うと、現在のように、array最後の要素が である奇数nullの長さがある場合、コードは失敗しますlenght == 1

于 2016-09-04T14:11:55.313 に答える