为什么我的一个打印功能会删除节点?

时间:2018-04-27 04:21:49

标签: c++ binary-tree

好的,所以我的二进制树程序有一个print函数,可以在Breadth-First中打印所有内容。当我调用它时,它按照我期望的顺序打印,但它也会删除除节点之外的所有节点,并留下一个空树。

void BST::breadth(Node *& cur_root)
{
    if (cur_root != NULL) {
        cout << cur_root->m_value;
        if (cur_root->m_left != NULL) { 
            myqueue.push(cur_root->m_left);
        }
        if (cur_root->m_right != NULL) {
            myqueue.push(cur_root->m_right);
        }
        if (!myqueue.empty()) {
            cout << ", "; 
            cur_root = myqueue.front();
            myqueue.pop();
            breadth(cur_root);
        } else {
            cout << "}" << endl;
        }
    }
}

我认为从myqueue中弹出节点可能是问题,但是当我使用普通打印功能(按顺序遍历)时,我不会遇到这个问题。

void BST::print(Node *& cur_root)
{
    if (cur_root != NULL) {
        print(cur_root->m_left);
        myqueue.push(cur_root);
        print(cur_root->m_right);
    }
    int sizecompare = myqueue.size();
    if (size() == sizecompare) {
        while (!myqueue.empty()) {
            cout << myqueue.front()->m_value;
            myqueue.pop();
            if (!myqueue.empty()) {
                cout << ", ";
            }
        }
        cout << "}" << endl;
    }
}

他们都使用相同的节点队列,所以我不明白为什么他们在弹出时表现不同。那么流行音乐功能是罪魁祸首吗?如果是这样,为什么它只发生在一个函数上?有没有办法可以解决它,所以我的节点没有被破坏?

2 个答案:

答案 0 :(得分:6)

因为您通过引用而不是按值传递cur_root。当您的breadth函数返回时,您的cur_root指向其他内容(树的末尾)。

您还可以避免递归:

void BST::breadth(Node* root)
{
    std::queue<Node*> myqueue;
    myqueue.push_back(root);
    bool first = true;

    cout << "{";

    while (myqueue.empty() == false) {
        cout << (first ? "" : ",");
        first = false;

        Node* current = myqueue.front();
        myqueue.pop();

        cout << current->m_value;

        if (current->left) {
            myqueue.push(current->left);
        }
        if (current->right) {
            myqueue.push(current->right);
        }
    }

    cout << "}" << endl;
}

答案 1 :(得分:0)

void BST::breadth(Node *& cur_root)

引用指针。

cur_root = myqueue.front();

将其更改为子节点之一。你刚刚覆盖了它。