返回从二进制树中删除的节点的指针

时间:2016-03-21 20:18:12

标签: c++ tree

简而言之,我正在编写一个编程任务,它维护一个链接的字符列表,每个字符都包含一个项目的二叉树。此树在名为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为空?

0 个答案:

没有答案
相关问题