如何将孩子添加到BST

时间:2013-06-04 04:39:52

标签: c++ recursion binary-search-tree addchild

我正在尝试创建/创建BST,但它似乎无法正常工作。我真的坐在这里好几个小时试图弄清楚发生了什么。我已经绘制了一百万个图表来解决这个问题,但是我的代码让我失望了。我需要将根节点传递给函数。然后我需要遍历树,直到我发现函数的父字符串参数与树父节点的字符串一致。如果我找到它,我必须将字符串插入父节点,并从该父节点创建两个新子节点。如果我找不到父字符串,那么我返回false。

 bool insertNode(BSTNode *n, char* parentQ, char* leftQ, char* rightQ)
 {   
  if(n->Q == parentQ)
  {
    n->left = new BSTNode(leftQ);
    n->right = new BSTNode(rightQ);
    return true;
  }
  else if(n->Q != parent)
  {
    insertNode(n->left,parentQ,leftQ,rightQ);
    insertNode(n->right,parentQ,leftQ,rightQ);
  }
  else
    return false;
}

另外,我需要制作另一个方法来获取我已经建立的树,并纠正字符串。因此,该方法修改了父字符串(如果找到),并查看其子项(如果找到),并将这些字符串替换为方法参数中找到的字符串。这有点像添加一个子树而不会搞砸整个树。提前谢谢!

bool changeNode(BSTNode *n,char* parentQ, char* leftQ, char* rightQ)
{
  if(n->Q == leftQ)
  {
    n->Q = parentQ;
    n->left = new BSTNode(leftQ);
    n->right = new BSTNode(rightQ);
    return true;
  }
  else if(n->Q == rightQ)
  {
    n->Q = parentQ;
    n->left = new BSTNode(leftQ);
    n->right = new BSTNode(rightQ);
    return true;
  }
  else if(n->Q != leftQ)
  {
    changeNode(n->left,parentQ,leftQ, rightQ);
  }
  else if(n->Q != rightQ)
  {
    changeNode(n->right,parentQ,leftQ,rightQ);
  }
    return false;
}

1 个答案:

答案 0 :(得分:1)

您甚至没有提到错误是什么,示例输入/预期输出,但是在调用具有这些子项的函数之前,您是否应该检查当前节点是否实际上有一个左右子项?

else if(n->Q != parentQ) // <--- you have a typo in this line, "parent"
  {                      //      (and you don't even need the 'if')
    insertNode(n->left,parentQ,leftQ,rightQ);
    insertNode(n->right,parentQ,leftQ,rightQ);
    // in this case you return nothing! corrupted return value
  }

^这似乎非常容易出错,尤其是空指针。你应该把它变成这样的东西:

    else
      {
        if(n->left != NULL) // take a look at nullptr if you have C++11
          if(insertNode(n->left,parentQ,leftQ,rightQ)) return true;
        if(n->right != NULL)
          if(insertNode(n->right,parentQ,leftQ,rightQ)) return true;
        return false;
      }

否则,true返回的内容永远不会传播回第一个return之外,因此您总是返回false,除非在树的根实际上是唯一的情况下你正在寻找的节点。

此外,请勿使用char比较两个==数组,除非n->Q实际上是std::string。否则,您应该使用if(strcmp(n->Q, parentQ) == 0)

然而,你的第二段代码只是一团糟。您需要更好地了解else if上究竟会发生什么,并查看它是否实际上正在执行您想要的操作(提示:它不是),因为您目前只执行最多1个代码块,即使有多个条件为真。