在C ++中使用队列构造二叉树

时间:2014-12-03 20:52:44

标签: c++ pointers data-structures

我正在尝试用C ++编写一些数据结构HW。当我尝试使用队列构建二叉树时,我对指针问题感到困惑。

class Tree{
private:
    struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};
public:
    TreeNode* root = NULL;       
    Tree();
    Tree(queue<int>& val);       
    ~Tree();
    string toString_bf();
};


Tree(queue<int> &vals){
    if (vals.empty())
        return;

    root = new TreeNode(vals.front());
    vals.pop();
    queue<TreeNode**> pts;       // what is the meaning of this? Why should use pointers to pointer?

    pts.push(&(root->left));     // also have doubts here, about the reference used in the parameter
    pts.push(&(root->right));
    while (!vals.empty()){
        TreeNode* t = new TreeNode(vals.front());
        *(pts.front()) = t;      // and here
        pts.pop();
        vals.pop();
        pts.push(&(t->left));
        pts.push(&(t->right));
    }
}

根据我的理解,左右两个都是指针,为什么不能只将值传递给它们?

1 个答案:

答案 0 :(得分:0)

变量pts是指向稍后需要放置子树的指针的队列。这些位置本身就是指向TreeNode的指针(每个位置都是类型为left的{​​{1}}或right数据成员),因此您需要一个TreeNode *指着他们。

换句话说,每次执行TreeNode **时,之前构建的*(pts.front()) = t;的{​​{1}}或left成员都会被设置为指向最近构建的节点

你可以制作一个right,使用它可能看起来更干净。


进一步澄清发生了什么:

每次&#39; while&#39;循环开始:

  • TreeNode是正在构建的树的根,包含n + 1个节点,每个节点包含从输入队列typedef TreeNode *TreePtr;获取的一个值(其中n是{的次数} {1}}循环已经运行了)

  • root包含尚未放入树中的所有剩余值(如果有)

  • vals包含一组指向树中节点内指针的指针;它包含指向尚未分配给它们的子树的所有指针的指针;这些中有n + 2个。

因此,每个循环生成一个新节点,使其中一个未分配的指针指向新节点,然后将新节点的未分配指针添加到队列。

请注意,当操作结束时,while中总会有n + 2个指针被丢弃。通过知道需要多少个节点(= vals.size()),一旦完成足够的操作就可以停止执行vals操作,这可以减少大约50%所需的临时空间量:

pts