【问题标题】:BST recursive insert - assign new node pointer as leaf's childBST 递归插入 - 将新节点指针分配为叶子的子节点
【发布时间】:2021-09-07 06:39:01
【问题描述】:

我正在尝试实现二叉树的插入方法,这就是我得到的:

struct node * addNode(struct node ** root, struct node * node){
    //base case: when reach leaf
    if (*root == NULL){
        printf("reached with root with node key = %i", node->key);
        return node;
    }
    if ((node -> key) > ((*root)->key)){ //add to the right subtree
        printf("node key is : %i, tree's node key is: %i\n", (node -> key), ((*root)->key));
        (*root)->right = addNode(&((*root)->right), node);
    } else {
        printf("node key is : %i, tree's node key is: %i\n", (node -> key), ((*root)->key));
        (*root)->left = addNode(&((*root)->left), node);
    }
    return node;
}

在这种情况下,将叶子的子节点设置为 *node 的指针不起作用,但我不知道为什么。写了一个驱动程序来测试这个方法后,我得到了分段错误。

【问题讨论】:

    标签: c recursion binary-tree function-definition


    【解决方案1】:

    如果函数使用返回类型结构node * 编写,则意味着该函数必须返回指向根节点的指针。但是,如果树不为空(即指向根节点的指针不等于 NULL),则函数返回指针 node

    struct node * addNode(struct node ** root, struct node * node){
        //...
        return node;
    }
    

    在这种情况下调用函数后喜欢

    root = addNode( &root, node );
    

    指向根节点的指针将始终等于node 的值。

    同样在这种情况下,将第一个参数声明为具有类型结构 node ** 是没有意义的。

    函数可以写成这样

    struct node * addNode( struct node *root, struct node * node )
    {
        //base case: when reach leaf
        if ( root == NULL )
        {
            return node;
        }
        else if ( node -> key > root->key )
        {
            root->right = addNode( root->right, node );
            return root;
        } 
        else 
        {
            root->left = addNode( root->left, node );
            return root;
        }
    }
    

    并像这样称呼

    root = addNode( root, node );
    

    【讨论】:

      【解决方案2】:

      如果不是NULL,更新*root后返回node是错误的。

      您应该返回*root 而不是以错误的方式修改树。

      【讨论】:

      • 但是要将返回的节点分配给 (*root)->right 或 (*root)->left 应该将父节点链接到子节点对吗?我不知道为什么这是一个错误的方法。
      • 将指针分配给子节点会将父节点链接到子节点。 node 是要添加的叶节点,可能不是要链接的子节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多