如何将二叉树的所有节点推入堆栈,然后打印堆栈内容?

问题描述

这是我尝试执行的操作,但出现“ bad_alloc”错误

stack<int>st;
void func(Node * root){
    
    if(root==NULL){
        return;
    }
    
    while(root!=NULL)
    {
        func(root->left);
        st.push(root->data);
        func(root->right);
    }

    //Printing stack data
    while (!st.empty()) 
    { 
        cout << '\t' << st.top(); 
        st.pop(); 
    } 
    cout << '\n'; 
    return 0; 
}

根节点作为func()中的参数传递。

解决方法

尽管不需要循环,但您同时使用while循环和递归。您可以使用顺序/后顺序/预遍历遍历并将元素推入堆栈。这是我的实现:

void inorder(Node* root){
    if(root == NULL)
        return;
    inorder(root->left);  // Call for left subtree
    st.push(root->data);  // Push the element to the stack 
    inorder(root->right); // Call for right subtree
    
}

然后只需打印堆栈。

,
while(root!=NULL)
{
    func(root->left);
    st.push(root->data);
    func(root->right);
}

这使程序进入无限循环。 root永远不会为空。您可以将其更改为if(root!=NULL)以实现您想要的目的,但是也不需要进行该检查,因为NULL检查是在此之前完成的。