嗨,鱼油!看你的问题,我觉得你可能掉进了一个常见的C++陷阱里。让我们一起来探讨一下这个问题,同时用点幽默让它更容易理解。
### 问题所在
你提到每次插入节点后,`Tree` 还是空的。这个问题其实出在 `InsertBST` 函数中,你对 `Tree` 进行了修改,但是这种修改并没有反映到调用 `InsertBST` 的地方。
简单地说,你传给 `InsertBST` 的是一个指针(Tree),但是指针本身是按值传递的。就像你把一个小纸条(地址)递给朋友,但朋友只是在他那里写了写,原来的纸条内容并没有改变。
### 解决方案
要解决这个问题,你有几种选择。其中一种是直接传递指针的指针,即指向指针的引用,这样你就能原地修改 `Tree` 了。让我们来改改代码吧!
#### 修改后的代码
我们先从 `InsertBST` 函数开始改造:
bool InsertBST(BiTree& Tree, int key) // 将Tree声明为BiTree的引用
{
BiTree PtrLastNode;
if (!SearchBST(Tree, key, nullptr, &PtrLastNode))
{
BiTree s = new BiTNode;
s->data = key;
s->lchild = s->rchild = nullptr;
if (!PtrLastNode)
{
Tree = s; // 这里会修改实际传入的Tree
}
else if (PtrLastNode->data > key)
{
PtrLastNode->lchild = s;
}
else
{
PtrLastNode->rchild = s;
}
return true;
}
else
{
return false;
}
}
接下来,在调用 `InsertBST` 时,也要进行适配:
int main()
{
int a[10] = { 5, 2, 1, 4, 7, 9, 0 ,8, 3, 6 }; // 注意数组定义语法上有个小错误,修正一下
BiTree Tree = nullptr;
for (int i = 0; i < 10; ++i)
{
InsertBST(Tree, a[i]); // 传递Tree的引用
}
}
### 谈谈选择的问题
如果你不喜欢使用引用,还可以选择其他方法,比如传递指向指针的指针:
bool InsertBST(BiTree* &Tree, int key); // 使用指针的指针
这样你也能通过指针的指针修改原始指针所指向的内容。
### 总结
希望以上解答对你有帮助!其实编程有时就像玩拼图,找到合适的片段放到对的位置,整个图就出来了。记住,玩得开心,不必太过于纠结!
加油,鱼油!如果还有问题,请随时问我,咱们继续搞定它!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |