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

二叉查找树

苏乐
2023-03-14

我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。

根据规范,该功能的工作方式如下:

rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。

为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个子树。

到目前为止,我有以下代码:

    struct treeNode {
    Type value;
    int count;
    treeNode* left;
    treeNode* right;
    };
    treeNode* root;

template <class Type>
void bstree<Type>::rebalance(treeNode* sroot){

    if (root == NULL) {
        throw new underflow_error("tree is empty");
    }

    while (skewness(sroot) != 0)
    {
        if (size(sroot->left) < size(sroot->right))
        {
            sroot->left.insert(sroot->value);
            sroot->left.insert(max(sroot->right));
            sroot->left.insert(min(sroot->right));

        }
        else
        {
            sroot->right.insert(sroot->value);
            sroot->left.insert(max(sroot->left));
            sroot->left.insert(min(sroot->left));
        }
    }

    rebalance(sroot->left);
    rebalance(sroot->right);
}

我不知道我是否正确地遵循了规范。我能得到一些见解或建议,比如我可能做错了什么吗?

共有1个答案

丁翰海
2023-03-14

您没有正确遵循规格。首先,您的再平衡操作会增加树的大小。另一方面,结果并不总是二叉搜索树。

在尝试实现这些树之前,您必须了解它们是如何工作的。这是没有办法的。我建议你研究你的文本(或维基百科),尝试用铅笔和纸构建和平衡一些树。

 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。

  • 我正在尝试用单词构建二叉搜索树。然而,当我使用上面的代码时,我只能访问我的根,根的左、右子项似乎为空。 法典:

  • 我正在做一个AlgoExpert挑战,我已经花时间自己解决它,看了关于它的视频讲座,我觉得我有一个很好的理解,但我在递归和树遍历方面的技能现在很低(这就是我工作的原因)。 这是提示 编写一个函数,该函数接受二进制搜索树(BST)和目标整数值,并返回与BST中包含的目标值最接近的值。每个BST节点都有一个整数值、一个左子节点和一个右子节点。其子节点本身是有效的BST节点或无/空 目标:12 这是我目

  • 请帮我修复我的代码。 对于方法,字符串的格式应为 空树应返回一组空括号。 对于我正在进行的Junit测试: 这是我的代码: 谢谢!!

  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树