因此,在这个特定程序中,我将节点存储在节点向量中。这些节点包含用户输入int ID,int age和string Name。
此向量用作按ID号组织的二叉搜索树,不担心要平衡。
目前我正在尝试编写一个插入函数,在该函数中,在创建用户输入值的新节点之后,它将它与根进行比较,根存储在向量的索引1处。
如果它小于根的ID,则将其置于位置(root * 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。
我完全不知道如何将这样的算法实现到循环中
非常感谢任何帮助。
这是我的代码。
void 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异常。
谢谢!
答案 0 :(得分:0)
我的问题基本上是,如何将这样的算法变成一个 while loop / do while循环等
这是一个使用伪代码的答案。您应该使用不同的构造重新编写循环,例如while,do while或for循环。
但首先,您的代码存在一些问题。
您正在将Node.ID
(一个int)与NULL
进行比较,以检查向量中的位置是否为“空”。 NULL
与0
具有相同的语义,因此我假设没有ID 0
。您的代码实际上并未对此进行检查,因此您可能希望处理该案例和/或解决这些设计问题。
如果您使用向量存储节点,我不知道为什么要使用new
动态分配内存。这可能会导致内存泄漏。
我假设您正在处理在尚未发布的代码中创建适当大小的向量。如果不这样做,那么当at
超出向量范围时root
抛出异常时,代码将崩溃。
如果它小于根的ID,则将其放入 位置(根* 2)。如果它大于根,则将其放置 到位(根* 2 + 1)
最后,带有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