二叉排序树各项操作
来源:互联网 发布:自由职业贷款软件 编辑:程序博客网 时间:2024/06/08 06:22
二叉排序树的各项操作
#include <stdio.h>#include <stdlib.h>#define MAX 20typedef int datatype;typedef struct bi_search_tree{ datatype key; struct bi_search_tree *left,*right;}*bst_tree;/*插入操作,value是待插入的值*/bst_tree bst_insert(bst_tree root, datatype value){ bst_tree parent, node, child; /*树为空,创建根节点*/ if(root == NULL) { root = (bst_tree )malloc(sizeof(bst_tree)); root->key = value; root->left = NULL; root->right = NULL; return root; } parent = root; /*记录下根节点的位置*/ node = root; while(node != NULL) { /*待插入数据已经存在,则返回*/ if(node->key == value) return root; else { parent = node; /*若小于节点的值,则查看节点的左孩子,否则,查看右孩子*/ if(node->key < value) node = node->right; else node = node->left; } } child = (bst_tree )malloc(sizeof(bst_tree)); child->key = value; child->left = NULL; child->right = NULL; if(value > parent->key) parent->right = child; else parent->left = child; return root;}/*查找,找到返回1,否则,返回0*/int bst_search(bst_tree root, datatype value){ bst_tree p; p = root; if(p == NULL) return 0; if(p->key == value) return 1; else if(p->key > value) return bst_search(p->left, value); else return bst_search(p->right, value);}/*删除节点值为value的节点*/int bst_delete(bst_tree root, datatype value){ bst_tree p, pre=NULL, mid; p = root; if(root == NULL) return 0; /*找到该节点*/ while((p != NULL) && (p->key != value)) { pre = p; if(p->key < value) { p = p->right; } else p = p->left; } if(p == NULL) return 0; /*至少有一个子节点为空*/ if( (p->left == NULL) || (p->right == NULL) ) { if( pre->left == p ) { pre->left = ( (p->left == NULL) ? p->right : p->left ); } else pre->right = ( (p->left == NULL) ? p->right : p->left ); free(p); /*释放节点*/ } else { /*删除的节点有2个子女*/ mid = p->right; pre = p; /*寻找中序的第一个节点*/ while(mid->left != NULL) { pre = mid; mid = mid->left; } /*移花接木,直接赋值,避免交换节点*/ p->key = mid->key; /*将mid节点的子节点作为pre的子节点,并将mid所指向的节点删除*/ if(pre->right == mid) pre->right = mid->right; else pre->left = mid->right; free(mid); } return 1;}/*中序输出bst树*/void bst_print(bst_tree root){ if(root == NULL) return; bst_print(root->left); printf(" %d ", root->key); bst_print(root->right);}int main(){ /*插入操作,value是待插入的值*/ bst_tree bst_insert(bst_tree root, datatype value); /*查找,找到返回1,否则,返回0*/ int bst_search(bst_tree root, datatype value); /*删除节点值为value的节点,成功返回1,否则,返回0*/ int bst_delete(bst_tree root, datatype value); /*中序输出bst树*/ void bst_print(bst_tree root); bst_tree root=NULL; int a[MAX]; int i=0; int length; printf("输入二叉排序树的记录个数:\n"); scanf("%d",&length); printf("输入要创建的二叉排序树的各个记录:\n"); for(i=0; i<length; i++) { scanf("%d",&a[i]); root = bst_insert(root, a[i]); } bst_delete(root, 5); bst_print(root); printf("\n%d %s\n", root->key, bst_search(root, 10) ? "yes":"no"); return 0;}
用于存储代码,同时希望对广大博友有用
0 0
- 二叉排序树各项操作
- 二叉排序树操作
- TextBox各项禁止操作
- 单链表的各项操作
- 单链表的各项操作
- 编译Room之各项操作
- 图像几何变换各项操作
- 二叉排序树-删除操作
- 二叉排序树删除操作
- 二叉排序树的基本操作
- 二叉排序树的操作
- 二叉排序树的操作_BinaryOrderTree
- 二叉排序树基本操作详解
- 二叉排序树的基本操作
- 二叉排序树的基本操作
- 二叉排序树相关操作
- 二叉排序树之删除操作
- 二叉排序树的相关操作
- 阅读图像显著性检测论文一:A Model of Saliency-Based Visual Attention for Rapid Scene Analysis
- HIVE精华汇总帖
- perl 导出函数到当前名字空间
- 【KMP】 hdu3746 kmp求循环节长度
- Android--Utils
- 二叉排序树各项操作
- HttpClient已过时,访问网络用HttpURLConnection
- golang---redis入门
- android6.0的坑
- SQLserver学习day06 T-SQL程序
- 安卓5.0以上系统无法调用WebService问题
- imge stitching图像拼接stitching
- 模式识别的基本方法
- jfinal文件form表单上传,ajaxfileupload异步上传