前几天,我试图自己实现AVL Tree ...尚未完成..而且我遇到了很多运行时错误...
基本上我有一个名为setbf的函数,该函数在树上的每个插入操作之后被调用。它计算或确切地重新计算每个节点的平衡因子(bf)...这里是实现
struct tnode*setbf(struct tnode*ptr){
if(ptr==NULL)
return ptr;
ptr->bf=height(ptr->left)-height(ptr->right);
ptr->left=setbf(ptr->left);
ptr->right=setbf(ptr->right);
return ptr;
}
那很好...但是在插入根节点之后。当我继续插入另一个新节点...将新内存分配给newnode的malloc函数不起作用时,为什么呢? ...在删除setbf函数后,它的工作效果非常好。...我对插入节点的实现如下。...
struct tnode*add(struct tnode*root,int val){
struct tnode*newnode=(struct tnode*)malloc(sizeof(struct tnode*));
newnode->info=val;
newnode->left=newnode->right=NULL;//runtime error occurs
if(root==NULL){
root=newnode;
}
else{
struct tnode*tree=root;
struct tnode*ptree=NULL;
while(tree!=NULL){
if(val<tree->info){
ptree=tree;
tree=tree->left;
}
else{
ptree=tree;
tree=tree->right;
}
}
if(val<ptree->info){
ptree->left=newnode;
}
else{
ptree->right=newnode;
}
}
root=setbf(root)//after removing this line everything works fine...
return root;
}
我认为此实现的效率很低,因为它占用了大量内存。请问该如何做进一步改进?