当前位置: 首页 > 知识库问答 >
问题:

找到一个永远完整的二叉查找树的根

竺承望
2023-03-14

我需要制作一个完整的二叉搜索树。如果我有一个看起来像这样的方法:

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;
}

共有3个答案

陈松
2023-03-14

二叉树的根不必是常数。存在自平衡树。看看这个:在这里输入链接描述

仰成天
2023-03-14

这是解决方案:

据我所知,计算偏移量是通过在长度上增加每个额外元素的偏移量,直到达到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

公孙高轩
2023-03-14

具有 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测试: 这是我的代码: 谢谢!!