數據結構---二叉搜索樹

  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 }
相關文章
相關標籤/搜索