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

时间:2021-06-03 18:57:53

标签: c++ data-structures binary-search-tree

在下面的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:我是新手,这是我在平台上的第一个问题。

1 个答案:

答案 0 :(得分:3)

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

N3337 6.6.3 return 语句说:

<块引用>

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

N3337 3.6.1 主要功能说明:

<块引用>

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

return 0;
相关问题