首页 > 解决方案 > 即使修改后,堆栈的顶部元素仍保持不变

问题描述

我正在尝试在函数 preorderTraversal 中修改堆栈 stk 的顶部元素的状态字段,但是该字段似乎不会随时更改为 2 并且一直在 0 和 1 之间切换。谢谢你。

这就是算法应该如何工作 -
如果栈顶元素的状态为 0 ,则在欧拉遍历(前序)中第一次访问节点 如果栈顶元素的状态为 1 ,则第二次访问节点在欧拉遍历中(有序) 如果栈顶元素的状态为 2 ,则在欧拉遍历(后序)中第三次访问节点。

我通过修改堆栈顶部的状态字段并相应地在向量中插入树的前序、中序和后序来跟踪状态。

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class pairr
{
public:
    TreeNode *node;
    int status;
    pairr(TreeNode *root, int status)
    {
        this->node = root;
        this->status = status;
    }
};
vector<int> preorderTraversal(TreeNode *root)  
{
    stack<pairr> stk; 
    vector<vector<int>> ans(3, vector<int>());   //ans[0 to 2] stores pre , in and postorder respectively . 
    stk.push(pairr(root, 0));
    while (stk.empty() != true)
    {
        pairr temp = stk.top();
        if (temp.status == 0)                   //if status is 0 ,in Euler traversal node is visited for the first time , so increase status to 1(preorder)
        {
            if (temp.node != NULL)
            {
                ans[0].push_back(temp.node->val);
                if (temp.node->left)
                {
                    stk.push(pairr(temp.node->left, 0));
                }
            }
            temp.status += 1;
        }
        else if (temp.status == 1) //if status is 1 , in Euler traversal node is visited for the second time, so increase status to 2(Inorder)
        {
            if (temp.node != NULL)
            {
                ans[1].push_back(temp.node->val);
                if (temp.node->right)
                {
                    stk.push(pairr(temp.node->right, 0));
                }
            }
            temp.status = 2;
        }
        else //if status is 2 , in Euler traversal node is visited for the third time, so add to vector and pop (Post order)
        {
            if (temp.node != NULL)
                ans[2].push_back(temp.node->val);
            stk.pop();
        }
    }
    return ans[0];
}

标签: c++algorithmdata-structurestreetree-traversal

解决方案


推荐阅读