我需要制作一个完整的二叉搜索树
。如果我有一个看起来像这样的方法:
public void createCompleteTree(Node n, int i)
例如,我用数字9作为< code>i的值,我该怎么做才能找到一个根来生成一棵完整的树呢?
如果我使用9作为值,则数字将为1,2,3,4,5,6,7,8,9
。对于完整的二叉搜索树,根必须为 6,如下所示:
我怎样才能制作一个知道这一点的方法?它应该适用于任何类型的数字,所以如果我想使用数字14,它应该能够。
到目前为止,我唯一拥有的代码是一个插入方法,它只是检查要插入的数字是大于(向右)还是小于(向左)而不是我们目前所在的节点。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;
}
二叉树的根不必是常数。存在自平衡树。看看这个:在这里输入链接描述
这是解决方案:
据我所知,计算偏移量是通过在长度上增加每个额外元素的偏移量,直到达到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
具有 N 个级别的二叉树可能包含从 2^(N-1) 到 2^N - 1 的元素。
您描述的最后一个(最低)级别的树可以按严格顺序包含 1 到 2^(N-1) 个元素。
具有 K 个元素和 N 个级别的树在其最后一个级别包含 K - 2^(N-1) 1 个元素。此树的左侧子树包含 C = 最小(K - 2^(N-1) 1, 2^(N-2)) 元素。所以树的根将是2^(N-2)C-th个元素
接受的答案可以做一棵完美的树(这也是一棵完整的树)。虽然它不能在没有完美的情况下做成一棵完整的树。不过,这是我的要求最接近的答案。为了在不完美的情况下进行竞争,你可以去掉树最右边的叶子。 1.问题: 试图将< code >二叉查找树变成< code >完整的二叉查找树。我可以找到很多< code >完全二叉树的代码示例,但是没有< code >完全二叉查找树。这个插件的工作就像二叉查找树应该做的那
我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个
在包含 main 函数的类中,定义一个函数调用 createTree(String strKey)。给出一个整数字符串(用空格字符分隔),此函数将创建一个 BST 树,其中整数键跟在输入字符串之后。示例:给定一个字符串 s = “30 20 40”。调用函数 createTree(s) 来创建二叉搜索树:root = 30,root.left = 20,root.right = 40。以下是我的代
主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:
我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。
请帮我修复我的代码。 对于方法,字符串的格式应为 空树应返回一组空括号。 对于我正在进行的Junit测试: 这是我的代码: 谢谢!!