插入二进制搜索树

时间:2012-03-01 20:19:49

标签: c binary-search-tree

所以我需要定义一个将i插入BST t的破坏性函数BST insertbst(int i,BST t)。也就是说,它修改t以包含i并返回结果树。运行时间必须为O(高度t)。

我已经提出了这个版本...但是给了我以下错误的ideone.com/xhxb6

BST insertbst(int i, BST t) {
    if (t == NULL) {
        return BSTmake(i, NULL, NULL);
    } else if (i < BSTkey(t)) {
        return BSTmake(BSTkey(t), insertbst(i ,BSTleft(t)), BSTright(t));
    } else {
        return BSTmake(BSTkey(t), BSTleft(t), insertbst(i ,BSTright(t)));
    }
}

我的代码中使用的其他函数可在以下位置找到:http://pastebin.com/TVYRE4Nd 有任何建议使其具有破坏性,或改变它以避免我的堆错误?

.h文件:http://ideone.com/QeSTl

测试文件:http://pastebin.com/9ca5i4My

1 个答案:

答案 0 :(得分:0)

您不能像现在这样使用BSTmake(),因为每次调用它时都会创建一个新的BST node,因为您可以确定新节点只应创建一次每个插页。

现在main

中的以下两个陈述
BST x = BSTmake(2, (BSTmake( 1, NULL, NULL)), (BSTmake(3, NULL,NULL)));
BST y = insertbst(4, x);

我不知道你对y应指向何处的假设。一般来说,BST的实现只会自己调用insert,传入要插入的noderoot node。您将看到使用此方法使代码更易于理解。您必须将第二行更改为insertbst( 4, &x)才能使用此模式。

然后,您必须更改insertbst的实施,如下所示:

  • 将第二个参数作为指向节点指针的指针传递,该节点指针代表newnode的父节点。
  • 如果BST *t为null,则创建一个新节点并将指针指向该节点以指向它。
  • 如果i < BSTkey(t)i > BSTKey(t),则需要通过将指针传递给左子树或右子树作为第二个参数来递归调用insertbst()。

这可能是这样的:

BST insertbst(int i, BST *t) {
    if (*t == NULL) {
        *t = BSTMake( i, NULL, NULL);
    }
    else if (BSTkey(newnode) < BSTkey(*t)) {
        insertbst( i, &t->left);
    }
    else {
        insertbst( i, &t->right);
    }
}

同样malloc()返回void *,指向分配的内存块。我假设BST已被typedef改为typedef struct bst_node * BST。因此,您应将newnode声明更改为BST newnode = (BST)malloc(sizeof(struct bst_node));