我需要做一个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,如下所示:
我怎样才能知道这一点?它可以使用任何数字,因此,如果我想使用数字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;
}
答案 0 :(得分:1)
二叉树可能包含从 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);
}
}
作为此代码的一部分发现:
答案 2 :(得分:-1)
您的二叉树的根不必是恒定的。 存在自平衡树。检查一下:enter link description here