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 }