搜索樹是一種能夠進行插入,搜索,刪除等操做的數據結構,能夠用做字典或優先級隊列。二叉搜索樹是最簡單的搜索樹。其左子樹的鍵值<=根節點的鍵值,右子樹的鍵值>=根節點的鍵值。數據結構
若是共有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 可是完善了代碼