简而言之,我正在编写一个编程任务,它维护一个链接的字符列表,每个字符都包含一个项目的二叉树。此树在名为Possessions的类中维护。函数dropItem(char * itemName)应该返回一个指向从二叉树中删除的项的指针。
功能如下:
Item *Possessions::dropItem(char *itemName) {
Item *back = NULL;
Item *temp = m_pRoot;
Item *delParent;
Item *delNode;
while ((temp != NULL) && (strcmp(itemName, temp->m_sItemName) != 0)) {
back = temp;
if (strcmp(itemName, temp->m_sItemName) < 0) {
temp = temp->m_pLeft;
}
else {
temp = temp->m_pRight;
}
}
if (temp == NULL) {
return false;
}
else {
delNode = temp;
delParent = back;
}
if (delNode->m_pRight == NULL) {
if (delParent == NULL) {
m_pRoot = delNode->m_pLeft;
return delNode;
}
else {
if (delParent->m_pLeft == delNode) {
delParent->m_pLeft = delNode->m_pLeft;
}
else {
delParent->m_pRight = delNode->m_pLeft;
}
cout << temp->m_sItemName;
return temp;
}
}
else {
if (delNode->m_pLeft == NULL) {
if (delParent == NULL) {
m_pRoot = delNode->m_pRight;
delete delNode;
return temp;
}
else {
if (delParent->m_pLeft == delNode) {
delParent->m_pLeft = delNode->m_pRight;
}
else {
delParent->m_pRight = delNode->m_pRight;
}
delete delNode;
return temp;
}
}
else {
temp = delNode->m_pLeft;
back = delNode;
while (temp->m_pRight != NULL) {
back = temp;
temp = temp->m_pRight;
}
Item *dupNode = new Item;
dupNode = temp;
dupNode->m_pLeft = NULL;
dupNode->m_pRight = NULL;
if (back == delNode) {
back->m_pLeft = temp->m_pLeft;
}
else {
back->m_pRight = temp->m_pLeft;
}
delete temp;
return dupNode;
}
}
}
但是,当我尝试删除一个项目(这个项目恰好没有子项)时,它返回NULL。然而,奇怪的是,当我在返回temp之前将断点设置为RIGHT(在第一个大if语句的末尾)时,如果我检查temp,则看起来temp似乎是NOT NULL。所以我很困惑为什么它会返回NULL,以及如何解决这个问题。
如果您需要更多信息,请与我们联系。
此外,m_pRoot是根,m_pLeft和m_pRight是指向左右节点的指针。
基本上,我不明白的是,如果我将返回温度改为cout&lt;&lt; temp,它确实给了我正确的temp地址。但是当我返回temp时它只给了我00000000.在返回和下一个被调用的函数之间会发生什么(在修改temp之后没有调用)可能会使temp为空?