问题描述
在下面的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;