1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 struct node 7 { 8 int val; 9 node *lch,*rch; 10 }; 11 12 node *insert(node *p,int x) 13 { 14 if(p==NULL) 15 { 16 // 申請一個新內存空間 17 node *q=new node; 18 q->val=x; 19 q->lch=q->rch=NULL; 20 return q; 21 } 22 else 23 { 24 if(x<p->val) 25 { 26 p->lch=insert(p->lch,x); 27 } 28 else 29 { 30 p->rch=insert(p->rch,x); 31 } 32 return p; 33 } 34 } 35 36 bool find(node *p,int x) 37 { 38 if(p==NULL) 39 { 40 return false; 41 } 42 else if(x==p->val) 43 { 44 return true; 45 } 46 else if(x<p->val) 47 { 48 return find(p->lch,x); 49 } 50 else 51 { 52 return find(p->rch,x); 53 } 54 } 55 56 57 // 刪除數值x 58 // 須要刪除的節點沒有左兒子,右兒子提上去 59 // 須要刪除的節點左兒子沒有右兒子,左兒子提上去 60 // 以上兩種都不知足,把左兒子中最大的節點提上去 61 node *remove(node *p,int x) 62 { 63 if(p==NULL) 64 { 65 return NULL; 66 } 67 else if(x<p->val) 68 { 69 p->lch=remove(p->lch,x); 70 } 71 else if(x<p->val) 72 { 73 p->rch=remove(p->rch,x); 74 } 75 // 若是沒有左子節點,右兒子提上去 76 else if(p->lch==NULL) 77 { 78 node *q=p->rch; 79 delete p; 80 return q; 81 } 82 // 有左兒子,可是左兒子沒有右兒子 83 else if(p->lch->rch==NULL) 84 { 85 // q爲左兒子 86 node *q=p->rch; 87 q->rch=p->rch; 88 delete p; 89 return q; 90 } 91 // 不然,只需把左兒子的最大節點提上去 92 else 93 { 94 // q爲p左子樹中最大節點的父節點 95 // 記錄父節點,方便以後實現 96 node *q; 97 for(q=p->lch;q->rch->rch!=NULL;q=q->rch); 98 // 由於只是將最大節點提到要刪除的p節點的位置 99 // 而最大的節點可能右左子樹節點,所以考慮q的左子樹節點 100 101 // r纔是要刪除節點p左子樹的最大節點,要提到p的位置 102 node *r=q->rch; 103 // r必定沒有左子節點,爲第一種狀況,要將右兒子提上去 104 q->rch=r->lch; 105 106 // 最後將最大節點提上去,並刪除p節點(不能提早刪除,須要將關係傳毒過去,最後刪除) 107 r->lch=p->lch; 108 r->rch=p->rch; 109 110 delete p; 111 return r; 112 } 113 // 若是當前還未找到要刪除節點,返回當前節點,保證連續關係 114 return p; 115 } 116 117 int main() 118 { 119 node *root=NULL; 120 root=insert(root,1); 121 find(root,1); 122 return 0; 123 }