#include
using namespace std;
//二叉树结点
template
struct BTNode
{
T data; //存储数据
BTNode *lchild, *rchild; //左右孩子指针
BTNode(T D, BTNode *l = NULL, BTNode *r = NULL) : data(D), lchild(l), rchild(r) {}
};
//二叉树
template
class BST
{
//属性值
private:
//根节点指针
BTNode *root;
//查找结点
bool SearchBSTP(BTNode *rt, T key, BTNode *&p = NULL, BTNode *f = NULL)
{
if (!rt) //查找失败
{
p = f;
return false;
}
else if (key == rt->data) //查找成功
{
p = rt;
return true;
}
else if (key > rt->data)
{
return SearchBSTP(rt->rchild, key, p, rt); //在右子树继续查找
}
else
{
return SearchBSTP(rt->lchild, key, p, rt); //在左子树继续查找
}
}
//插入结点
bool Insert(BTNode *&rt, T key)
{
BTNode *p = NULL;
if (!this->SearchBSTP(rt, key, p))
{
BTNode *s = new BTNode(key, NULL, NULL);
if (!p)
{
rt = s;
}
else if (key < p->data)
{
p->lchild = s;
}
else
{
p->rchild = s;
}
return true;
}
else
{
return false;
}
}
//删除结点
bool Delete(BTNode *&p)
{
BTNode *q;
if(!p->lchild)
{
q=p;
p=p->rchild;
delete q;
}
else if (!p->rchild)
{
q=p;
p=p->lchild;
delete q;
}
else
{
BTNode *s=p;
q=p->lchild;
while(q->rchild)
{
s=q;
q=q->rchild;
}
p->data=q->data;
if(s!=p)
{
s->rchild=q->lchild;
}
else
{
s->lchild=q->lchild;
}
delete q;
}
return true;
}
bool DeleteBSTP(BTNode *&rt,T key)
{
if(!rt)
{
//未找到
return false;
}
else
{
if(rt->data==key)
{
//找到key
return Delete(rt);
}
else if (rt->data>key)
{
return DeleteBSTP(rt->lchild,key);
}
else
{
return DeleteBSTP(rt->rchild,key);
}
}
}
//中序遍历
void InOrder(BTNode *rt)
{
if(rt)
{
InOrder(rt->lchild);
cout<data<<" ";
InOrder(rt->rchild);
}
}
//删除二叉树
void Destory(BTNode *&rt)
{
if(rt)
{
Destory(rt->lchild);
Destory(rt->rchild);
delete rt;
}
}
//行为属性
public:
//构造函数
BST(BTNode *r = NULL) : root(r) {}
//拷贝构造函数
BST(const BST &bt) : root(NULL)
{
}
//删除二叉树
void Destory()
{
this->Destory(this->root);
this->root=NULL;
}
//析构函数
~BST()
{
this->Destory();
}
//获得根指针
BTNode *Getroot()
{
return this->root;
}
//搜索值
//并将
bool SearchBST(T key, BTNode *p = NULL)
{
return this->SearchBSTP(this->root, key, p, NULL);
}
//插入结点,顺序插入
/*1、先判断此值是否存在,若存在,则返回true
2、若不存在,创造结点s,并顺序插入二叉树中
3、若不存在,则存在指针p指向查找路径的最后一个结点
4、判断插入值和指针p指向的值的大小,若key>p->data,则p->rchild=s;
否则p->lchild=s;
*/
bool InsertBST(T key)
{
return this->Insert(this->root, key);
}
//shanchujiedian
bool DeleteBST(T key)
{
return this->DeleteBSTP(this->root, key);
}
void InOrder()
{
this->InOrder(this->root);
}
};
int main()
{
BST temp;
int a[] = {62,58,88,47,73,99,35,51,93,29,37,49,56,36,48,50};
for (int i = 0; i < 16; i++)
{
temp.InsertBST(a[i]);
}
temp.InOrder();
cout< //BTNode *p;
cout << "查找结果:" << temp.SearchBST(51) << endl;
temp.DeleteBST(62);
cout << "查找结果:" << temp.SearchBST(50) << endl;
temp.InOrder();
cout< temp.Destory();
temp.InOrder();
cout<
system("pause");
return 0;
}