所以我需要定义一个将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 有任何建议使其具有破坏性,或改变它以避免我的堆错误?
答案 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
,传入要插入的node
和root 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));
。