首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

帮忙:二叉搜索树 删除结点 算法出错解决办法

2012-03-06 
帮忙:二叉搜索树 删除结点 算法出错#include stdlib.h#include stdio.htypedef struct node{char data

帮忙:二叉搜索树 删除结点 算法出错
#include <stdlib.h>
#include <stdio.h>

typedef struct node{
char data;
struct node * left;
struct node * right;
}BST;

static BST * root;

void insert(char data){//生成
BST * current;
BST ** link;
link = &root;

while((current = *link) != NULL){
if(current->data> data){
link = &current->left;
}else if(current->data < data){
link = &current->right;
}else{
return;
}
}

current = (BST*)malloc(sizeof(BST));
current->data = data;
current->left = NULL;
current->right = NULL;
*link = current;
}

bool delete_node(BST *);
bool delete_BST(BST * n, char data){//删除
BST * current;
current = n;
if(current == NULL)
return false;
if(current->data == data){
return delete_node(current);
}else if(current->data > data){
return delete_BST(current->left,data);
}else{
return delete_BST(current->right,data);
}
}

bool delete_node(BST * p){//删除某个结点
BST * q,*s;
if(!p->left){ //left child is null
q = p;
p = p->right;
free(q);
q = NULL;
}else if(!p->right){//right child is null
q = p;
p = p->left;
free(q);
q = NULL;
}else{// both childs are not null
q = p;
s = p->left;
while(s->right){
q = s;
s = s->right;
}
p->data = s->data;
if(q == p){
q->left = s->left;
}else{
q->right = s->left;
}
free(s);

}
q = NULL;
s = NULL;
return true;
}


void mid_order(){//中序遍历
BST * current = root;
BST * stack[30];
int top = 0;
while(true){
while(current){
stack[top++] = current;
current = current->left;
}
if(top > 0){
top--;
current = stack[top];
printf("%c ",current->data);
current = current->right;
}else
return;
}
}

int main(){
char a = 'a';
char b = 'b';
char c = 'c';
insert(a);
insert(b);
insert(c);

mid_order();
printf("\n");

delete_BST(root,b);
mid_order();
printf("\n");
}


[解决办法]
我的下载页面有,去下载一个吧,要不你给我你的邮箱我发给你,我在大二做课程设计的时候做了一个基于排序二叉树的个人通信录,有详细的设计文档。
[解决办法]
做过一样的题。感觉还好,也有过BUG。但是自己用单步调试调出来了。建议LZ以后多多单步测试,自己解决了问题那是个很享受的过程~
[解决办法]
乱码传了两次,上面那段代码,就没问题了

热点排行