会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
1989huangkq
huangkq1989
博客园
|
首页
|
新随笔
|
新文章
|
联系
|
订阅
|
管理
二叉排序树
/*********************************** * * 二叉排序树:查找、插入、删除 * author : kangquan2008 * * **********************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Node{ int data; struct Node * left; struct Node * right; }Node,* Tree; /* * 返回值:判断是否找到 * 参数:parent 指向父节点,初始指向NULL * target 指向目标节点的指针 * tree 所要查找的树 * find_target 所要找到的目标 */ int find(Tree tree, Node * parent, Node ** target, int find_target) { if(tree == NULL) { *target = parent; return -1; } if(tree->data == find_target) { *target = tree; return 0; }else if(tree->data > find_target){ find(tree->left,tree,target,find_target); }else{ find(tree->right,tree,target,find_target); } } /* * 功能:插入 * 参数:tree所要插入的树,传的是指向指针的指针@.@ * data所要插入的值,若已存在,则不再插入. * */ int insert(Tree * tree,int data) { Node * target; if(find(*tree,NULL,&target,data) == -1)// 找不到 { Node * node = malloc(sizeof(Node)); node->left = NULL; node->right = NULL; node->data = data; if(target == NULL)// 空树 *tree = node; else if(target->data > data) target->left = node; else target->right = node; return 0; }else return -1;// 找到,不再操作 } /* * 功能:删除一个节点 * 参数:tree 所要删除的树 * data 所要删除的节点 */ void delete(Tree * tree); int delete_node(Tree * tree,int data) { if(*tree == NULL) return -1; if((*tree)->data == data) { delete(tree); return 1; } else if((*tree)->data > data) delete_node(&((*tree)->left),data); else delete_node(&((*tree)->right),data); } void delete(Tree * tree) { Node * tmp = NULL; if(!(*tree)->right)// 右子树为空,其实左右子树为空也归结到这里了 { tmp = *tree; *tree = (*tree)->left; free(tmp); }else if(!(*tree)->left)//左子树为空 { tmp = *tree; *tree = (*tree)->right; free(tmp); }else{// 左右子树均不空 tmp = *tree; Node * biggest = (*tree)->left; while(biggest->right) // 走到biggest节点的右子树尽头 { tmp = biggest; biggest = biggest->right; } (*tree)->data = biggest->data;// 只是改要删节点的值,不删该节点 if(tmp == (*tree))// 左子树无右子树,直接将biggest的左子树接到要删节点的左子树 (*tree)->left = biggest->left; else// 左子树有右子树,将biggest的左子树接到其父节点的右子树上 tmp->right = biggest->left; free(biggest); } } void print(Tree tree) { if(tree == NULL) return ; printf("%d ",tree->data); print(tree->left); print(tree->right); } int main() { Tree tree = NULL; // 记得初始化为NULL!!!!!!!!!!!!!!!!!!!!!!!! Node * parent = NULL; Node * target = NULL; srand(time(NULL)); int a[] = {26,58,96,7,47,53,50,4,94,29}; for(int i=0; i<10; i++) { insert(&tree,a[i]); } print(tree); printf("\n"); int data; while(1) { scanf("%d",&data); if(delete_node(&tree,data) == -1) printf("not found\n"); print(tree); printf("\n"); } return 0; }
发表于
2011-10-04 14:06
huangkq1989
阅读(
94
) 评论(
0
)
收藏
举报
刷新页面
返回顶部
公告