如何验证B树是否已排序

时间:2015-02-23 19:02:36

标签: algorithm sorting data-structures b-tree

我只是把这作为一个面试问题而且想知道是否有人知道答案?

编写一个方法来验证B树是否正确排序。您无需验证是否 树是平衡的。将以下模型用于B树中的节点。

用Java完成并使用这个模型:

class Node {
List<Integer> keys;
List<Node> children;
} 

1 个答案:

答案 0 :(得分:0)

一种(空间效率低但很简单)这样做的方法是对B树进行通用的顺序遍历,以便在排序的顺序中取回密钥,然后检查是否该序列实际上是按排序顺序。这是一些快速代码:

public static boolean isSorted(Node root) {
    ArrayList<Integer> values = new ArrayList<Integer>();
    performInorderTraversal(root, values);
    return isArraySorted(values);
}

private static void performInorderTraversal(Node root, ArrayList<Integer> result) {
    /* An empty tree has no values. */
    if (result == null) return;

    /* Process the first tree here, then loop, processing the interleaved
     * keys and trees.
     */
    performInorderTraversal(root.children.get(0), result);
    for (int i = 1; i < root.children.size(); i++) {
        result.add(root.children.get(i - 1));
        performInorderTraversal(root.children.get(i), result);
    }
}

private static boolean isArraySorted(ArrayList<Integer> array) {
    for (int i = 0; i < array.size() - 1; i++) {
        if (array.get(i) >= array.get(i + 1)) return false;
    }
    return true;
}

这需要时间O(n)并使用空间O(n),其中n是B树中元素的数量。您可以将空间使用量减少到O(h),其中h是B树的高度,通过不存储遍历中的所有元素,而只是跟踪最后一个元素,如果下一个,则提前停止搜索 - 遇到的值不大于前一个。我没有在这里这样做,因为它需要更多的代码,但从概念上讲它并不太难。

希望这有帮助!