Recursivley测试二进制搜索树是否完整

时间:2016-04-30 00:12:26

标签: java recursion binary-search-tree

几天前,我问了一个关于同一个项目的问题,从那时起我们的小组就设法完成了所有方法,除了用于确定二元搜索树是否完整的方法。

我们使用包装器方法和辅助方法递归执行此操作。

我们知道我们需要检查树的h-1级(h是高度)以确保它是完美的,然后我们需要确保最终级别的所有叶节点都从左到左没有差距。

无论我们尝试什么,我们都无法弄清楚如何递归检查剩余的叶子节点,以确保它们从左到右连续。我们能够确保它完美达到等级(h-1)。

有人能指出我们正确的方向,如何递归检查最后一级的叶子节点,以确保它们保持对齐?

到目前为止这是代码?

JAXRSClientFactory.create(baseUri, Service.class, Arrays.asList(new JacksonJsonProvider())

P.S所有琐碎的案例都在isPerfect()方法中处理,因为每个完美的树也都是完整的

2 个答案:

答案 0 :(得分:0)

我将尝试首先记下算法以检查完整性,然后转到代码。

让我们在预先顺序遍历方法中考虑这一点。

  • 需要树中的节点数
  • 从root用户递归,将root视为节点索引0
  • 如果node为null,则树完成
  • 如果节点索引大于(或等于)树中的节点数,那么它就不完整
  • 递归左右子树;给定预先遍历遍历方法,左侧树获得索引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)方法,与此处给出的一些答案相比。

这里的答案是我原来问题的最佳答案

  1. 如果hR>树没有完整。
  2. 如果hL-HR> 1,树不完整。
  3. 如果hR == hL,那么左子树必须是完美的,而右子树必须是完整的
  4. 否则(hL - hR == 1),然后是左边 子树必须是完美的和正确的子树 必须是完美的。
  5. 步骤3和4必须递归检查树是否为Perfect()和isComplete()