我正在尝试创建/创建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;
}
答案 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个代码块,即使有多个条件为真。