搜索树是一种能够进行插入,搜索,删除等操做的数据结构,能够用做字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。数据结构
若是共有n个元素,那么每次操做须要的O(log n)的时间.学习
经常使用知识点spa
假设查找的值为x,从根节点的值开始比对,若是小于根节点的值,则往左儿子继续查找,若是大于根节点的值,则往右儿子继续查找.依次类推.直到当前节点的值等于要查找的值..net
以查找数值10为例code
按照查找的步骤便可找到插入值应该在的位置blog
以插入数值6为例队列
有四种状况:rem
1: // 当前节点无左节点 ,右字节点7覆盖5, io
: 3: // 当前节点无右节点 ,右字节点7覆盖5, class
: 4: // 删除节点5的左节点没有右节点, 只须要8做为3的右节点 ,3节点覆盖5
: 2: 若是以上3中状况都没有,只须要寻找当前节点的左节点的全部字节点的最大值,用最大值填充5节点 4填充5
#include <stdio.h> #include <stdlib.h> struct TNode{ int data; struct TNode *lt; struct TNode *rt; }; struct TNode* insrtTree(struct TNode *t,int key,int i); void printTree(struct TNode *root); struct TNode* delTree(struct TNode* t,int key); int find(struct TNode* t,int key); int arr[1000]={0}; int main(){ int n,m; int i,t; scanf("%d%d",&n,&m); struct TNode *root=NULL; for(i=0;i<n;i++){ scanf("%d",&arr[i]); root=insrtTree(root,arr[i],i); } //t=arr[m-1]; /* if(arr[m-1]==0){ printf("Right child"); }else{ printf("Light child"); }*/ root=delTree(root,10); printTree(root); return 0; } int find(struct TNode* pt,int key){ if(pt==NULL)return NULL; else if(pt->data==key)return 1; else if(pt->data>key) return find(pt->lt,key); else if(pt->data<key) return find(pt->rt,key); } // 删除节点 struct TNode* delTree(struct TNode* pt,int key){ if(pt==NULL)return NULL; else if(pt->data>key) pt->lt=delTree(pt->lt,key);//寻找左节点 else if(pt->data<key) pt->rt=delTree(pt->rt,key);//寻找右节点 // 找到节点 处理四种状况 else if(pt->lt==NULL){ // 当前节点无左节点 struct TNode* curt=pt->rt; free(pt); return curt; }else if(pt->rt==NULL){// 当前节点无右节点 struct TNode* curt=pt->lt; free(pt); return curt; }else if(pt->lt->rt==NULL){// 当前节点的左节点无右节点 struct TNode* curt=pt->lt; curt->rt=pt->rt; free(pt); return curt; }else{ // 以上不知足就把左儿子的子孙中最大的节点, 即右子树的右子树的...右子树, //提到须要删除的节点位置 struct TNode* p; for(p=pt->lt;p->rt->rt!=NULL;p=p->rt); struct TNode* curt=p->lt; p->rt=curt->rt; curt->lt=pt->lt; curt->rt=pt->rt; free(p); return curt; } return pt; } struct TNode* insrtTree(struct TNode *t,int key,int i){ if(t==NULL){ //处理第一个节点 以及子节点为NULL状况 t=(struct TNode*)malloc(sizeof(struct TNode)); t->lt=t->rt=NULL; t->data=key; return t; } if(t->data>key){// 插入左子树状况 arr[i]=1; t->lt=insrtTree(t->lt,key,i); }else{ // 插入右子树状况 arr[i]=0; t->rt=insrtTree(t->rt,key,i); } return t; } void printTree(struct TNode *root){ if(root==NULL)return; printf("%d ",root->data); printTree(root->lt); printTree(root->rt); }
说明: 自己学习了 https://blog.csdn.net/li_l_il/article/details/88677927 可是完善了代码