尽管C++的STL模板中有set、multiset等关联容器能够起到二叉排序树的作用,但是动手写一写二叉排序树能够提升写代码的能力,并且能够加深对二叉排序树思想的理解。
typedef int etype;
class BiTree {
public:
BiTree* lchild, *rchild;
etype data;
void DeleteNode(BiTree* T,etype key, BiTree** f);
bool SearchNode(BiTree* T, BiTree* f, etype key, BiTree** p);
void InsertNode(BiTree** T, etype key);
void Delete(BiTree* p, BiTree** f);
};
void BiTree::DeleteNode(BiTree* T, etype key, BiTree** f) {
if (!T) {
std::cout << "Delete Error!" << std::endl;
}
else if (T->data == key) {
Delete(T,f);
}
else if (T -> data > key) {
*f = T;
DeleteNode(T->lchild, key,f);
}
else if (T->data < key) {
*f = T;
DeleteNode(T->rchild, key,f);
}
return;
}
bool BiTree::SearchNode(BiTree* T, BiTree* f, etype key, BiTree** p) {
if (!T) {
std::cout << "Not Find!" << std::endl;
*p = f;
return false;
}
else if (T->data == key) {
std::cout << "Find it!" << std::endl;
return true;
}
else if (T->data > key) {
return SearchNode(T->lchild, T, key, p);
}
else if (T->data < key) {
return SearchNode(T->rchild, T, key, p);
}
}
void BiTree::InsertNode(BiTree** T, etype key) {
BiTree* p = new BiTree;
if (!SearchNode(*T, NULL, key, &p)) {
BiTree* s = new BiTree;
s->data = key;
s->lchild = NULL;
s->rchild = NULL;
if (!p)
*T = s;
else if (p->data > key)
p->lchild = s;
else
p->rchild = s;
std::cout << "Insert Successfully!" << std::endl;
}
return;
}
void BiTree::Delete(BiTree* p,BiTree** f) {
if (!p->lchild&&!p->rchild) {
if ((*f)->lchild == p)(*f)->lchild = NULL;
else (*f)->rchild = NULL;
delete p;
}
else if (!p->lchild) {
BiTree* q = p;
p = p->rchild;
if ((*f)->lchild == q)(*f)->lchild = p;
else (*f)->rchild = p;
delete q;
}
else if (!p->rchild) {
BiTree* q = p;
p = p->lchild;
if ((*f)->lchild == q)(*f)->lchild = p;
else (*f)->rchild = p;
delete q;
}
else {
BiTree* q = p,* s=p->lchild;
while (s->rchild) {
q = s;
s = s->rchild;
}
p->data = s->data;
if(q!=p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
delete s;
}
return;
}
int main() {
int demo[5] = { 1,2,8,4,6 };
BiTree* T = new BiTree;
T = NULL;
for (int i = 0; i < 5; i++)
T->InsertNode(&T, demo[i]);
BiTree* p = new BiTree;
BiTree* f = new BiTree;
T->SearchNode(T,NULL,4,&p);
T->DeleteNode(T, 4, &f);
T->SearchNode(T, NULL, 4, &p);
delete p;
delete T;
system("pause");
return 0;
}