#include<iostream>
using namespace std;
//创建树的简单结构体,包含当前节点的数据和左右孩子的指针
struct btree
{
int date;
btree *lchild, *rchild;
};
//初始化根节点,可以不需要初始化
btree* init_root(int key)
{
btree * root = new btree;
root->date = key;
root->lchild = root->rchild = nullptr;
return root;
}
//在二叉树上搜索对应的值,找到返回对应节点的指针,找不到返回nullptr
btree* searchbst(btree* t, int key)
{
if ((!t) || t->date == key) return t;
else if (key < t->date) return searchbst(t->lchild, key);
else return searchbst(t->rchild,key);
}
//在二叉树上插入对应的元素
void insertbst(btree* &t, int key)
{
if (!t)
{
btree* s = new btree;
s->date = key;
s->lchild = s->rchild = nullptr;
//cout << "s:"<<s << endl;
t = s;
}
else if(key<t->date)
{
insertbst(t->lchild, key);
}
else if (key > t->date)
{
insertbst(t->rchild, key);
}
}
//创建一个二叉排序树,定义数据为999时退出创建
#define ENDFLAG 999
void create(btree *&t)
{
t = nullptr;
int e;
cin >> e;
while (e != ENDFLAG)
{
insertbst(t, e);
cin >> e;
}
}
//对二叉树进行中序遍历
void InOrderTraverse(btree* T)
{
/*中序遍历*/
if (T)
{
InOrderTraverse(T->lchild);
cout << T->date<<" ";
InOrderTraverse(T->rchild);
}
}
//删除指定元素
void deletebst(btree* t, int key)
{
btree *p = t;
btree *f = nullptr;
btree *q = nullptr;
btree *s = nullptr;
while (p)
{
if (p->date == key) break;
f = p;
if (p->date > key) p = p->lchild;
else p = p->rchild;
}
if (!p) return;
if (p->lchild&&p->rchild)
{
q = p;
s = p->lchild;
while (s->rchild)
{
q = s; s = s->rchild;
}
p->date = s->date;
if (q != p) q->rchild = s->lchild;
else q->lchild = s->rchild;
delete s;
return;
}
else if (!p->rchild)
{
q = p; p = p->lchild;
}
else if (!p->lchild)
{
q = p; p = p->rchild;
}
if (!p) t = p;
else if (q == f->lchild) f->lchild = p;
else f->rchild = p;
delete q;
}
int main()
{
btree* root=init_root(50);
cout << root->date << " " << root->lchild << " " << root->rchild << endl;
//btree* find = searchbst(root, 10);
//cout << find << endl;
insertbst(root, 50);
insertbst(root, 25);
insertbst(root, 75);
cout << "***********" << endl;
cout << root->date << " " << root->lchild->date << " " << root->rchild->date << endl;
//使用create函数创建二叉排序树
btree* newt;
create(newt);
cout << newt->date <<" "<< newt->lchild << " " << newt->rchild << endl;
cout << "中序遍历树" << endl;
InOrderTraverse(newt);
deletebst(newt, 61);
cout << "中序遍历树" << endl;
InOrderTraverse(newt);
system("pause");
return 0;
}
数据结构:二叉排序树的实现
最新推荐文章于 2023-06-01 17:16:46 发布