几天前,我问了一个关于同一个项目的问题,从那时起我们的小组就设法完成了所有方法,除了用于确定二元搜索树是否完整的方法。
我们使用包装器方法和辅助方法递归执行此操作。
我们知道我们需要检查树的h-1级(h是高度)以确保它是完美的,然后我们需要确保最终级别的所有叶节点都从左到左没有差距。
无论我们尝试什么,我们都无法弄清楚如何递归检查剩余的叶子节点,以确保它们从左到右连续。我们能够确保它完美达到等级(h-1)。
有人能指出我们正确的方向,如何递归检查最后一级的叶子节点,以确保它们保持对齐?
到目前为止这是代码?
JAXRSClientFactory.create(baseUri, Service.class, Arrays.asList(new JacksonJsonProvider())
P.S所有琐碎的案例都在isPerfect()方法中处理,因为每个完美的树也都是完整的
答案 0 :(得分:0)
我将尝试首先记下算法以检查完整性,然后转到代码。
让我们在预先顺序遍历方法中考虑这一点。
2*i + 1
,右侧树获得2*i + 2
。了解为什么这应该有效。
以下是完整的树 [方括号中的节点索引] 。 请注意,在完整二叉树的情况下,节点索引严格小于完整二叉树中的节点数。
1 [0]
/ \
/ \
[1] 2 3 [2]
/ \
/ \
[3] 4 5 [4]
返回树中节点总数的函数
private int totalNodes(Node root) {
if (root == null)
return 0;
return 1 + totalNodes(root.left) + totalNodes(root.right));
}
现在,包装器isComplete()函数 [带0个参数,因为根将是一个类字段] ...
public boolean isComplete() {
return isCompleteHelper(root, 0, totalNodes(root));
}
isCompleteHelper()...
private booelan isCompleteHelper(Node root, int indx, int totalNodes) {
// empty tree
if (root == null)
return true;
// present index >= number of nodes in tree
if (indx >= totalNodes)
return false;
// recurse
return isCompleteHelper(root.left, 2*indx+1, totalNodes) && isCompleteHelper(root.right, 2*indx+2, totalNodes);
}
答案 1 :(得分:0)
我能够与我的教授沟通,并且他通过isComplete方法中的一个参数通知了O(n)方法,与此处给出的一些答案相比。
这里的答案是我原来问题的最佳答案
步骤3和4必须递归检查树是否为Perfect()和isComplete()