微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bst insert中第二个return root语句的意义是什么?

如何解决bst insert中第二个return root语句的意义是什么?

在下面的insert函数中,在bst中插入一个项目的代码中,我觉得没有使用第二个return语句,因为总是在叶子节点之后添加一个节点。

struct node* insert(struct node* node,int key)
{
    if (node == NULL)
        return newNode(key);
    if (key < node->key)
        node->left = insert(node->left,key);
    else if (key > node->key)
        node->right = insert(node->right,key);
    return node;
}

但是当我删除这个返回语句时,我得到了以下驱动程序代码的完全不同的输出

int main()
{
    struct node* root = NULL;
    root = insert(root,50);
    insert(root,30);
    insert(root,20);
    insert(root,40);
    insert(root,70);
    insert(root,60);
    insert(root,80);
    inorder(root);  // A utility function to do inorder traversal of BST
}

对于插入函数中带有第二个返回语句的插入函数我得到

20 30 40 50 60 70 80

对于没有第二个返回语句的插入函数

40 50 80 

这种差异的原因是什么?

以上代码取自https://www.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/

PS:我是新手,这是我在平台上的第一个问题。

解决方法

在不执行 main() 语句的情况下到达非空函数的末尾(return 除外)会调用未定义的行为。因此,在没有第二个 return 语句的情况下,任何结果都是允许的。

N3337 6.6.3 return 语句说:

从函数末尾流出相当于一个没有值的return;这导致未定义 返回值函数中的行为。

N3337 3.6.1 主要功能说明:

如果控制到达终点 main 没有遇到 return 语句,效果就是执行

return 0;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。