请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师好,关于BST的一个小问题

二分搜索树课程中老师的add代码是这样写的(我弄成了c++代码):

Node* add(Node *node, int e){
    if(node == nullptr){
        node = new Node(e);
        return node;
    }
    if(node->data > e) {
        node->left = add(node->left, e);
    }
    else {
        node->right = add(node->right, e);
    }
    return node;
}

很直观,容易看懂

但是我徒手撸的时候,写成了这样:

void add(Node *node, int e){
    if(node == nullptr){
        node = new Node(e);
        return;
    }
    if(node->data == e) return;
    if(node->data > e) add(node->left, e);
    else add(node->right, e);
}

如果这么写程序会崩溃,我想了很久,也在纸上画了画,就是想不出来哪里出了问题。请问和您写的带返回值的add,我的版本有什么漏洞?

正在回答

2回答

为什么要return,其中的原因,和课程中介绍的递归删除算法(5-3至5-5),我们的remove要返回节点,道理是一样的。


设想,如果没有return,你的添加逻辑只在递归终止操作的node = new Node(e) 这句话中。而node只是这个函数中的一个局部变量而已。当这个函数执行完毕,这个局部变量就被释放了,而他所指向的空间也就丢失了。而return回去,让他赋值给上一层的node.left或者node.right,才可以真正的吧这个new出来的节点挂接在整个BST上。


对此,也可以参考这个问答:http://coding.imooc.com/learn/questiondetail/88146.html 虽然探讨的是链表,但道理是一样的。当然,也建议你写一个链表的递归版本,再仔细感受一下这个差异。


加油!:)

2 回复 有任何疑惑可以回复我~
  • 提问者 1Kasshole #1
    老师的回答非常精确!
    回复 有任何疑惑可以回复我~ 2018-12-21 10:10:47
Heartlaughter 2019-12-26 17:45:13

只new了一个node,没有具体的把这个node加到左子树或右子树的步骤

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信