查找二:二叉排序树查找

  1 //二叉排序树
  2 #include<iostream>
  3 using namespace std;
  4 
  5 typedef struct BiTNode
  6 {
  7     int data;  //结点数据
  8     BiTNode *lchild, *rchild; //左右孩子指针
  9 }*BiTree;
 10 
 11 //递归查找二叉排序树T中是否存在key
 12 //指针f指向T的双亲,初始值为NULL
 13 //若查找成功,指针p指向该数据元素结点并返回true
 14 //否则指针p指向查找路径上访问的最后一个结点并返回false
 15 bool SearchBT(BiTree T, int key, BiTree f, BiTree *p)
 16 {
 17     if(!T)
 18     {
 19         *p = f;
 20         return false;
 21     }
 22 
 23     if(key==T->data)
 24     {
 25         *p = T;
 26         return true;
 27     }
 28     else if(key<T->data)
 29     {
 30         return SearchBT(T->lchild, key, T, p);
 31     }
 32     else
 33     {
 34         return SearchBT(T->rchild, key, T, p);
 35     }
 36 }
 37 
 38 //当二叉排序树T中不存在关键字等于key的数据元素时
 39 //插入key并返回true,否则返回false
 40 bool InsertBST(BiTree *T, int key)
 41 {
 42     BiTree p, s;
 43     if(SearchBT(*T,key,NULL,&p))
 44         return false;
 45     else
 46     {
 47         s = new BiTNode;
 48         s->data = key;
 49         s->lchild = s->rchild = NULL;
 50         if(!p)
 51             *T = s;  //插入s为新的根结点
 52         else if(key<p->data)
 53             p->lchild = s; //插入s为左孩子
 54         else
 55             p->rchild = s; //插入为s的右孩子
 56         return true;
 57     }
 58 }
 59 
 60 //从二叉排序树中删除结点p,并重接它的左右子树
 61 bool Delete(BiTree *p)
 62 {
 63     BiTree q, s;
 64     if((*p)->rchild==NULL) //若右子树为空
 65     {
 66         q = *p;
 67         *p = (*p)->lchild;
 68         delete q;
 69     }
 70     else if((*p)->lchild==NULL) //若左子树为空
 71     {
 72         q = *p;
 73         *p = (*p)->rchild;
 74         delete q;
 75     }
 76     else //左右子树均不为空
 77     {
 78         q = *p;
 79         s = (*p)->lchild;
 80         while(s->rchild)
 81         {
 82             q = s;
 83             s = s->rchild;
 84         }
 85         (*p)->data = s->data;
 86         if(q!=*p)
 87             q->rchild = s->lchild;
 88         else
 89             q->lchild = s->lchild;
 90         delete s;
 91     }
 92     return true;
 93 }
 94 
 95 //若二叉排序树T存在关键字等于key的数据元素时,删除该结点
 96 bool DeleteBST(BiTree *T, int key)
 97 {
 98     if(!*T)
 99         return false;
100     else
101     {
102         if(key==(*T)->data)
103             return Delete(T);
104         else if(key<(*T)->data)
105             return DeleteBST(&(*T)->lchild, key);
106         else
107             return DeleteBST(&(*T)->rchild,key);
108     }
109 }
110 
111 void PreOrderPrint(BiTree T)
112 {
113     if(T==NULL)
114         return; 
115     cout<<T->data<<" ";
116     PreOrderPrint(T->lchild);
117     PreOrderPrint(T->rchild);
118 }
119 
120 int main()
121 {
122     int a[10] = {62,88,58,47,35,73,51,99,37,93};
123     BiTree T = NULL;
124 
125     for(int i=0;i<10;i++)
126         InsertBST(&T,a[i]);
127     PreOrderPrint(T);
128     cout<<endl;
129     DeleteBST(&T,93);
130     PreOrderPrint(T);
131     cout<<endl;
132     DeleteBST(&T,47);
133     PreOrderPrint(T);
134     cout<<endl;
135     
136     system("pause");
137     return 0;
138 }

 

posted @ 2016-10-13 15:37  jx_yangbo  阅读(183)  评论(0编辑  收藏  举报