鱼C论坛

 找回密码
 立即注册
查看: 384|回复: 1

二叉排序树的插入错误

[复制链接]
发表于 2024-7-9 21:38:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
BST.h

#pragma once
#include <iostream>

using namespace std;

typedef struct BiTNode
{
        int data;
        struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

bool SearchBST(BiTree Tree, int key, BiTree LastNode, BiTree *PtrLastNode);

bool InsertBST(BiTree Tree, int key);

BST.cpp

#include "BST.h"

bool SearchBST(BiTree Tree, int key, BiTree LastNode, BiTree *PtrLastNode)
{
    if (!Tree)
    {
        *PtrLastNode = LastNode;
        return false;
    }
    else if(Tree->data == key)
    {
        *PtrLastNode = Tree;
        return true;
    }
    else if (Tree->data < key)
    {
        return SearchBST(Tree->rchild, key, Tree, PtrLastNode);
    }
    else
    {
        return SearchBST(Tree->lchild, key, Tree, PtrLastNode);
    }
}

bool InsertBST(BiTree Tree, int key)
{
    BiTree PtrLastNode;
    if (!SearchBST(Tree, key, nullptr, &PtrLastNode))
    {
        BiTree s = new BiTNode;
        s->data = key;
        s->lchild = s->rchild = nullptr;

        if (!PtrLastNode)
        {
            Tree = s;
        }
        else if (PtrLastNode->data > key)
        {
            PtrLastNode->lchild = s;
        }
        else
        {
            PtrLastNode->rchild = s;
        }

        return true;
    }
    else
    {
        return false;
    }
}

main.cpp

#include "BST.h"

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始终为nullptr空指针。
我向InsertBST传入的已经是一个指针Tree了,为什么在InsertBST中将s赋值给Tree后仍然为空?

感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-9 21:39:08 | 显示全部楼层
嗨,鱼油!看你的问题,我觉得你可能掉进了一个常见的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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 02:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表