查找将始终构成完整二进制搜索树的根

时间:2018-10-10 16:20:15

标签: java binary-tree binary-search-tree

我需要做一个Complete Binary Search Tree。 如果我有一个看起来像这样的方法:

public void createCompleteTree(Node n, int i)

例如,我使用数字9作为i的值,我该怎么做才能找到将构成完整树的根?

如果我使用9作为值,则数字将为1,2,3,4,5,6,7,8,9。 对于完整的Binary搜索树,其根必须为6,如下所示:

enter image description here

我怎样才能知道这一点?它可以使用任何数字,因此,如果我想使用数字14,应该可以。

到目前为止,我仅有的代码是insert方法,该方法仅检查要插入的数字是否大于(当前)节点(向右)或小于(当前)节点(向左)。 x是要插入的数字,t是我们在树中的当前节点:

 private BinaryNode<AnyType> insert( AnyType x, BinaryNode<AnyType> t )
{
    if( t == null )
        return new BinaryNode<>( x, null, null );

    int compareResult = x.compareTo( t.element );

    if( compareResult < 0 )
        t.left = insert( x, t.left );
    else if( compareResult > 0 )
        t.right = insert( x, t.right );
    else
        ;  // Duplicate; do nothing
    return t;
}

3 个答案:

答案 0 :(得分:1)

具有 N 级的

二叉树可能包含从 2 ^(N-1) 2 ^ N-1 元素。
您描述的树的最后(最低)级别可能包含从 1 2 ^(N-1)的严格顺序的元素。
具有 K 元素和 N 级别的树在其最后一级包含 K-2 ^(N-1)+ 1 元素。 该树的左子树包含 C = min(K-2 ^(N-1)+ 1,2 ^(N-2))个元素。 因此树的根将是 2 ^(N-2)+ C -th个元素

答案 1 :(得分:0)

这是解决方案:

据我所知,通过增加长度上每个附加元素的偏移量直到达到水平宽度的1/2来计算偏移量。因此,高度为4的BST在最低级别具有8个元素。大小为8、9、10,……15的列表创建高度为4的BST。对于那些列表,列表的根索引为4、5、6、7、7、7、7、7。

似乎可以工作

private int calcMid(int length) {
    if ( length <= 4 )
        return length / 2;
    int levelSize = 1;
    int total = 1;
    while ( total < length ) {
        levelSize *= 2;
        total += levelSize;
    }
    int excess = length - (total - levelSize);
    int minMid = (total - levelSize + 1) / 2;
    if ( excess <= levelSize / 2 ) {
        return minMid + (excess - 1); 
    } else {
        int midExcess = levelSize/2; 
        return minMid + (midExcess - 1);
   }
}

作为此代码的一部分发现:

https://stackoverflow.com/a/52749727/9899617

答案 2 :(得分:-1)

您的二叉树的根不必是恒定的。 存在自平衡树。检查一下:enter link description here