在C++中使用队列构造二叉树
Constructing a binary tree using queue in C++
我正在尝试用C++编写一些数据结构硬件。当我尝试使用队列构建二叉树时,我不知何故对指针问题感到困惑。
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));
}
}
按照我的理解,左和右都是指针,为什么不能直接传递给它们?
变量pts
是指向稍后需要放置子树的位置的指针队列。这些位置本身就是指向TreeNode
的指针(每个位置都是left
或right
数据类型为 TreeNode *
的数据成员(,因此您需要一个TreeNode **
来指向它们是有意义的。
换句话说,每次执行*(pts.front()) = t;
时,都会将先前构造的TreeNode
的left
或right
成员设置为指向最近构造的节点。
你可以做一个typedef TreeNode *TreePtr;
,也许使用它看起来更干净。
为了进一步澄清正在发生的事情:
每次"while"循环启动时:
-
root
是正在构建的树的根,包含 n+1 个节点,每个节点保存一个从输入队列vals
中获取的值(其中 n 是while
循环已经运行的次数( -
vals
包含尚未放入树中的所有剩余值(如果有( -
pts
包含一组指向树中节点内的指针的指针;它包含指向尚未分配子树的所有指针的指针;其中有 n+2 个。
,然后将新节点的未分配指针添加到队列中。
请注意,当操作结束时,pts
中总是有 n+2 个指针,这些指针将被丢弃。通过知道需要多少节点( = vals.size(((,一旦完成足够的节点,就可以停止执行pts.push
操作,从而将所需的临时空间量减少约 50%:
vals.pop();
if( pts.size() < vals.size()) {
pts.push(&(t->left));
pts.push(&(t->right))
} // otherwise we have enough for all remaining vals.
相关文章:
- 从父数组测试用例构造二叉树失败
- 打印时有二叉树问题.用户输入不打印任何内容
- 试图找到二叉树的深度
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 指向二叉树中新节点的指针
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 二叉树级别顺序遍历在leetcode中
- 运行无限循环的最小二叉树问题
- 打印二叉树中的常见元素
- 二叉树基准测试结果
- 带有矢量重复值的二叉树打印出来
- 签入二叉树的函数是平衡C++
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何计算给定数字在二叉树中出现的次数?
- 为什么我的二叉树会覆盖其根的叶子?
- 将二叉树的节点插入链表 (C++)
- 二叉树级别顺序插入 c++
- 在C++中使用队列构造二叉树
- 使用模板中的二叉树作为优先队列