Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;删除二叉搜索树的节点_C++_Algorithm_Binary Search Tree - Fatal编程技术网

C++ C++;删除二叉搜索树的节点

C++ C++;删除二叉搜索树的节点,c++,algorithm,binary-search-tree,C++,Algorithm,Binary Search Tree,我用字符串创建了二叉搜索树。 每个节点都包含字符串和字符串的频率 所以这个问题给了我两个条件。我必须用s2替换s1。如果s2不存在,我将创建一个频率为s1的新节点。如果存在s2,我将s1的频率添加到s2的频率中。 在下面的代码中,我跳过了替换部分。我只删除s1并保存其频率。 但它不起作用。。。它没有打印任何东西 struct node{ string data; int freq; node *left, *right; node(string d, int f)

我用字符串创建了二叉搜索树。 每个节点都包含字符串和字符串的频率

所以这个问题给了我两个条件。我必须用
s2
替换
s1
。如果
s2
不存在,我将创建一个频率为
s1
的新节点。如果存在
s2
,我将
s1
的频率添加到
s2
的频率中。 在下面的代码中,我跳过了替换部分。我只删除
s1
并保存其频率。 但它不起作用。。。它没有打印任何东西

struct node{
    string data;
    int freq;
    node *left, *right;
    node(string d, int f){
        data = d;
        freq = f;
        left = right = nullptr;
    }
};
class lexicon {
public:
    lexicon();
    ~lexicon();

    void insert(const string &s);
    int lookup(const string &s);
    int depth(const string &s);
    void replace(const string &s1, const string &s2);

    friend ostream & operator << (ostream &out, const lexicon &l);
private:
    node *root;
    static node *FindMin(node* r){
        if(r == nullptr)
            return nullptr;

        while(r->left != nullptr)
            r = r->left;

        return r;
        }
    static node *DeleteNode(node *r, string v){
        if(r == nullptr)
            return r;

        int state = v.compare(r->data);
        if(state > 0)
            r->right = DeleteNode(r->right, v);
        else if(state < 0)
            r->left = DeleteNode(r->left, v);
        else {
            //No child
            if(r->right == nullptr && r->left == nullptr){
                delete r;
                r = nullptr;
            }
            //One child
            else if(r->right == nullptr){
                node *temp = r;
                r = r->left;
                delete temp;
            }
            else if(r->left == nullptr){
                node *temp = r;
                r = r->right;
                delete temp;
            }
            //Two children
            else{
                node *temp = FindMin(r->right);
                r->data = temp->data;
                r->freq = temp->freq;
                r->right = DeleteNode(r->right,temp->data);
            }
            return r;

        }
    }
};

void lexicon::replace(const string &s1, const string &s2){
    root = DeleteNode(root, s1);
}
struct节点{
字符串数据;
国际频率;
节点*左,*右;
节点(字符串d,整数f){
数据=d;
频率=f;
左=右=空PTR;
}
};
课堂词汇{
公众:
词汇();
~lexicon();
无效插入(常量字符串和s);
整数查找(常量字符串&s);
整数深度(常量字符串和s);
无效替换(常量字符串和s1、常量字符串和s2);
friend ostream和操作员左!=nullptr)
r=r->左;
返回r;
}
静态节点*DeleteNode(节点*r,字符串v){
if(r==nullptr)
返回r;
int state=v.compare(r->data);
如果(状态>0)
r->right=DeleteNode(r->right,v);
else if(状态<0)
r->left=DeleteNode(r->left,v);
否则{
//没有孩子
如果(r->right==nullptr&&r->left==nullptr){
删除r;
r=nullptr;
}
//独生子女
else if(r->right==nullptr){
节点*temp=r;
r=r->左;
删除临时文件;
}
否则如果(r->left==nullptr){
节点*temp=r;
r=r->右;
删除临时文件;
}
//两个孩子
否则{
节点*temp=FindMin(r->右侧);
r->data=temp->data;
r->freq=温度->频率;
r->right=DeleteNode(r->right,temp->data);
}
返回r;
}
}
};
void lexicon::replace(常量字符串&s1,常量字符串&s2){
根=删除节点(根,s1);
}

我建议您使用调试器逐行检查代码,这会让您了解代码出了什么问题。我使用的是代码块,但我不知道如何设置和使用调试器。(我在git hub上cs50课程时使用了调试器,但即使我尝试在代码块上使用dubugger,我也不知道如何……“我正在使用代码块,但我不知道如何设置和使用调试器。”容易找到的材料:我想这是我上次尝试使用的视频。我想我应该再试一次。感谢我比WATCHNG视频更容易研究文档。你可能应该考虑使用后一个链接。我建议你检查你的代码逐行使用调试器,这应该给你一个GRA。sp它出了什么问题。我正在使用代码块,但我不知道如何设置和使用调试器。(我在git hub学习cs50课程时使用了调试器,但即使我尝试在代码块上使用dubugger,我也不知道如何…)“我正在使用代码块,但我不知道如何设置和使用调试器。”容易找到的材料:我想这是我上次尝试使用的视频。我想我应该再试一次。感谢我比WATCHNG视频更容易研究文档。你可能应该考虑跟后一个链接。