二叉搜索树是一种可以高效完成以下操作的树型的数据结构
- 插入一个值
- 查询是否含有某个值
- 删除某个值
下面是基本的二叉搜索树的实现代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int val;
node *lch, *rch; //左右儿子
};
//插入x
node *insert(node *p, int x)
{
if(p==NULL)
{
node *q = new node;
q->val = x;
q->lch = q->rch = NULL;
return q;
}
else
{
if(x<p->val)
p->lch = insert(p->lch, x);
else
p->rch = insert(p->rch, x);
return p;
}
}
bool find(node *p, int x)
{
if(p==NULL)
return false;
else if(x == p->val)
return true;
else if(x < p->val)
return find(p->lch, x);
else
return find(p->rch, x);
}
node *remove(node *p, int x)
{
if(p==NULL)
return NULL;
else if(x < p->val)
p->lch = remove(p->lch, x);
else if(x > p->val)
p->rch = remove(p->rch, x);
else if(p->lch == NULL)
{
node *q = p->rch;
delete p;
return q;
}
else if(p->lch->rch==NULL)
{
node *q = p->lch;
q->rch = p->rch;
delete p;
return q;
}
else
{
node *q;
for (q = p->lch; q->rch->rch != NULL; q = q->rch)
;
node *r = q->rch;
q->rch = r->lch;
r->lch = p->lch;
r->rch = p->rch;
delete p;
return r;
}
return p;
}
void Printnode(node *p) //中序遍历,从小到大输出
{
if(p == NULL)
{
return;
}
else
{
Printnode(p->lch);
printf("%d ", p->val);
Printnode(p->rch);
//return;
}
}
int main(int argc, char *argv[])
{
node *root = NULL;
int n;
while(cin>>n)
{
int num;
for (int i=0; i<n; i++)
{
scanf("%d", &num);
root = insert(root, num);
}
Printnode(root);
//printf("%d\n", root->val);
}
return 0;
}