C ++使用数组

时间:2018-05-03 23:13:56

标签: c++ algorithm loops vector binary-search-tree

因此,在这个特定程序中,我将节点存储在节点向量中。这些节点包含用户输入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异常。

谢谢!

1 个答案:

答案 0 :(得分:0)

  

我的问题基本上是,如何将这样的算法变成一个   while loop / do while循环等

这是一个使用伪代码的答案。您应该使用不同的构造重新编写循环,例如whiledo whilefor循环。

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

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

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

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

  4.   

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

    1. 如果ID等于根目录的ID,该怎么办?
    2. 最后,带有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