【问题标题】:Why do I need to use queue<TreeNode**>q and cannot use queue<TreeNode*>q?为什么我需要使用 queue<TreeNode**>q 而不能使用 queue<TreeNode*>q?
【发布时间】:2021-02-04 03:08:22
【问题描述】:

我对编码比较陌生,所以我希望能得到一些帮助,尤其是当我没有人可以询问并且只有书籍和 YouTube 可以咨询时。

这是我的函数代码,该函数从给定的字符串按级别顺序生成二叉树。为了弄清楚这一点,我做了很多试验和错误。

我的问题是为什么这段代码只在队列包含指针地址时才有效,即队列是queue&lt;TreeNode**&gt;q,而不是当它由指针组成时,即queue&lt;TreeNode*&gt;q

注意:在使用队列q 时,我显然会使用将 root 存储在其中而不是 &root 的必要做法。

我觉得第二种情况(queue&lt;TreeNode*&gt;q)也应该有效,因为它是指针而不是实际存储的对象。所以它应该与存储左右的逻辑相同。

 TreeNode* deserialize(string data) {
    if(data=="#,"){return {};}
    
    stringstream a(data);
    string temp;
    vector<string>token;
    while(getline(a, temp, ','))
    {token.push_back(temp);}
 
    TreeNode* root=NULL;
    queue<TreeNode**>q;
    q.push(&root);
    for(int i=0;i<token.size();i++)
    {
        if(token[i]!="#")
        {
            (*q.front())=new TreeNode(stoi(token[i]));
            q.push(&(*q.front())->left);
            q.push(&(*q.front())->right);
        }
        q.pop();
    }
    return root;
}

};

使用当前代码并使用队列q;,本质上发生的事情是我正在获取一个数字并将其存储在 TreeNode 中,然后将 TreeNodes 左右子节点推入队列。最终结果是一棵连接的树。 使用 queueq 完成后,同样的事情 DOES NOT 会导致节点连接。

【问题讨论】:

  • 每次推送时,都会额外引用&amp;,每次弹出时,都会取消引用*。您创建了额外的抽象层;这就是为什么类型是这样的原因。
  • 你尝试queue&lt;TreeNode*&gt;时失败了什么?编译错误?逻辑错误?输出错误?这不像我们可以调查你的想法,看看你尝试了什么。 (嗯,至少我们大多数人。)也许你应该发布不起作用的代码,而不是发布有效的代码?

标签: c++


【解决方案1】:

你所做的是,你在 q.push(&root) 行中将 root 的地址推送到队列中,而不仅仅是 root。这就是为什么它需要双指针。参考以下代码:

TreeNode* deserialize(string data) {
    if(data=="#,"){return {};}
    
    stringstream a(data);
    string temp;
    vector<string>token;
    while(getline(a, temp, ','))
    {token.push_back(temp);}
 
    TreeNode* root=NULL;
    queue<TreeNode*>q;
    q.push(root);
    for(int i=0;i<token.size();i++)
    {
        if(token[i]!="#")
        {
            (q.front())=new TreeNode(stoi(token[i]));
            q.push(q.front()->left);
            q.push(q.front()->right);
        }
        q.pop();
    }
    return root;
}
};

也改变这些行:

if(token[i]!="#")
        {
            (*q.front())=new TreeNode(stoi(token[i]));
            q.push(&(*q.front())->left);
            q.push(&(*q.front())->right);
        }
        q.pop();

参考上面的代码

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多