繁体   English   中英

C ++使用数组插入二进制搜索树

[英]C++ Insert Into Binary Search Tree Using Array

因此,在此特定程序中,我将节点存储在节点向量中。 这些节点包含用户输入的int ID,int年龄和字符串Name。

此向量旨在充当由ID号组织的二叉搜索树,并且不担心被平衡。

当前,我正在尝试编写一个插入函数,在该函数中,在创建用户输入值的新节点之后,将其与根进行比较,该根存储在向量的索引1中。

如果它小于根的ID,则将其放置在位置(根* 2)。 如果它大于根,则将其放置在位置(根* 2 +1)

但是,如果这两个点已经被另一个节点占用,那么放入向量中的难度将非常大。

有什么办法可以创建一个循环来检查填充点中的值,并继续循环直到找到空点?

我正在使用的当前示例

ID 50,ID 100,ID 75

ID 50在位置1。

ID 100插入位置3,因为它为空(2 * 1)

尝试插入ID 75,但填充了位置3,因此我需要使用相同算法将其与位置3中的ID进行比较。 在这种情况下,由于75小于100,它将被放置在位置4。

我完全不知道如何将这样的算法实现为循环

任何帮助将非常感激。

这是我的代码。

无效的BST :: insert(){

int ID;
int AGE;
string NAME;
bool done = false;

int root = 1;

cout << "Please enter the ID number, age and name" << endl;
do
{
    cin >> ID >> AGE >> NAME;
} while (ID <= 0);



Node *tree = new Node(ID, AGE, NAME);


if (!binaryTree.empty())
{

    do
    {
        Node &n = binaryTree.at(root);
        if (n.ID == 0)
        {
            n.ID = ID;
            n.age = AGE;
            n.name = NAME;
            done = true;
            break;
        }
        else if (ID < n.ID)
        {
            root = 2 * root;
        }
        else
        {
            root = 2 * root + 1;
        }
    } while (done = true);
}

if (binaryTree.empty())
{
    binaryTree.push_back(*tree);
}


start();

}

我对这门语言还很陌生,因此对您的帮助将不胜感激!

编辑:

我修复了一些差异,并添加了建议的代码,但是,现在引发了out_of_bounds异常。

谢谢!

我的问题本质上是,我如何将这样的算法转换为while循环/执行while循环等

这是使用伪代码的答案。 您应该使用不同的构造(例如whiledo whilefor循环)自行重写循环。

但是首先,您的代码存在一些问题。

  1. 您正在将Node.ID (一个int)与NULL以检查向量中的位置是否为“空”。 NULL0具有相同的语义,因此我将假设没有ID为0 您的代码实际上并未对此进行检查,因此您可能需要处理这种情况和/或解决这些设计问题。

  2. 我不知道如果使用向量存储节点,为什么要动态分配new内存。 这可能会导致内存泄漏。

  3. 我假设您正在处理尚未发布的代码中的适当大小的向量。 如果不这样做,那么当root在向量的边界之外时, at抛出异常时,您的代码将崩溃。

如果它小于根的ID,则将其放置在位置(根* 2)。 如果它大于根,则将其放置在位置(根* 2 +1)

  1. 如果ID等于根目录的ID怎么办?

最后,带有goto循环的代码。

int root = 1;

BEGIN LOOP            
    Node &n = binaryTree.at(root);
    if (n.ID == 0)
    {
        n.ID = ID;
        n.age = AGE;
        n.name = NAME;
        BREAK OUT OF LOOP
    }
    else if (ID < n.ID)
    {
        root = 2*root;
    }
    else
    {
        root = 2*root + 1;
    }
REPEAT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM