这是用于构建二叉树的函数,其中参数是整数列表(列表)和要写入树(树)的空向量。我确定这是一个非常简单的错误,但由于某种原因,我忽略了导致这种循环的原因。谢谢你的帮助。
void buildTree(vector<int> list, vector<int> tree)
{
for(int i=0; i<list.size(); i++)
{
bool placed = false;
int source = 1;
while(!placed)
{
if(tree[source] == NULL)
{
tree[source] = list[i];
placed = true;
}
else if(list[i] < source)
{
source = 2*source;
}
else if(list[i] > source)
{
source = 2*source+1;
}
}
}
}
答案 0 :(得分:1)
假设list[0]
为1,tree[1]
不为NULL。在这种情况下,while循环将无限执行,因为没有满足树if
条件。
答案 1 :(得分:0)
您的比较list[i] < source
和list[i] > source
应为list[i] < tree[source]
和list[i] > tree[source]
。截至目前,您正在将要插入的值与树矢量的INDEX进行比较。
答案 2 :(得分:0)
问题是您要将值(即list[i]
)与索引(即source
)进行比较,而不是使用tree[source]
:
else if(list[i] < tree[source])
{
source = 2*source;
}
else if(list[i] > tree[source])
{
source = 2*source+1;
}
此外,您的程序未指定list[i]
等于tree[source]
时会发生什么,这可能会导致无限循环。
您的程序的另一个问题是,在通过索引取消引用其中一个元素之前,它不会检查tree
的大小。这可能会导致未定义的行为。要解决这个问题,请添加这个&#34; catch子句&#34;到你的while
循环:
if (source >= tree.size()) {
cerr << "Tree index exceeds the allocated size. Breaking the loop." << endl;
break;
}
答案 3 :(得分:0)
您的代码存在一些问题:
- 你按值接收向量,在向函数的所有调用中复制向量,为此,在函数外部你无法访问写入的vector tree
并且正在支付性能命中。
-i假设您正在使用空树(如果不是擦除行if (tree.size() < source) { tree.resize(source); }
。这是因为无法预测表示树的向量大小,取决于列表中的元素。这可以通过增强分配更多空间以避免多次连续分配,例如:分配sources * factor
(因子> 1.0)而不是像source
这样的矢量。
- 您正在将列表元素与索引tree
:else if(list[i] < source)
进行比较,这需要与值进行比较。
void buildTree(const vector<int>& list, vector<int>& tree) {
for (int i = 0; i < list.size(); i++) {
bool placed = false;
int source = 1;
while (!placed) {
if (tree.size() < source) {
tree.resize(source);
}
if (tree[source - 1] == 0) {
tree[source - 1] = list[i];
placed = true;
} else if (list[i] < tree[source - 1]) {
source = 2 * source;
} else if (list[i] > tree[source - 1]) {
source = 2 * source + 1;
}
}
}
}
std::vector<int> tree;
buildTree(std::vector<int>{5, 2, 4, 13, 8, 25, 32}, tree);
答案 4 :(得分:0)
你的逻辑似乎是错的。你正在比较&#34; list item&#34;使用&#34;索引源&#34;。
如果您正在尝试构造&#34;二进制堆&#34;,从结果树中没有元素开始,
代码可能很复杂。
而是尝试将列表复制到树中,然后使用
在树中调整前半部分元素
修改逻辑。