代码之家  ›  专栏  ›  技术社区  ›  Zevvysan

为什么我的打印函数之一要删除节点?

  •  0
  • Zevvysan  · 技术社区  · 6 年前

    好的,我的二叉树程序有一个打印函数,它以宽度优先打印所有内容。当我调用它时,它会按我期望的顺序打印,但是它也会删除除一个节点以外的所有节点,并给我留下一个空树。

    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中弹出节点可能是问题所在,但当我使用正常的print函数(为了遍历顺序)时,我没有这个问题。

    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;
        }
    }
    

    它们都使用相同的节点队列,所以我不理解为什么它们在弹出时会表现不同。那么,pop函数是罪魁祸首吗?如果是,为什么它只发生在一个函数上?有没有一种方法可以绕过它,这样我的节点就不会被破坏?

    2 回复  |  直到 6 年前
        1
  •  6
  •   selbie    6 年前

    因为你要通过 cur_root 通过引用而不是通过值。当您的 breadth 函数返回,您的 cur\u根目录 指的是其他东西(树的末端)。

    您还可以避免递归:

    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;
    }
    
        2
  •  0
  •   Jay Wai Tan    6 年前
    void BST::breadth(Node *& cur_root)
    

    接受对指针的引用。

    cur_root = myqueue.front();
    

    将其更改为子节点之一。你只是写得太多了。