我只是把这作为一个面试问题而且想知道是否有人知道答案?
编写一个方法来验证B树是否正确排序。您无需验证是否 树是平衡的。将以下模型用于B树中的节点。
用Java完成并使用这个模型:
class Node {
List<Integer> keys;
List<Node> children;
}
答案 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树的高度,通过不存储遍历中的所有元素,而只是跟踪最后一个元素,如果下一个,则提前停止搜索 - 遇到的值不大于前一个。我没有在这里这样做,因为它需要更多的代码,但从概念上讲它并不太难。
希望这有帮助!