您的位置:首页 > 其它

BST二叉查找树

2016-07-30 17:53 190 查看
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node* lchild;
struct node* rchild;
}NODE;
//注:平均深度 O(log N)
void Insert(NODE *&p, int x)
{
if (p == NULL)
{
p = (NODE*)malloc(sizeof(NODE));
p->data = x;
p->lchild  = NULL;
p->rchild = NULL;
}
else
{
if (x < p->data)
Insert(p->lchild, x);
else
Insert(p->rchild, x);
}
}
NODE *Create(NODE *p,int a[],int n)//建立方法只需要插入一系列的值即可
{
for (int i = 0; i < n; i++)
Insert(p, a[i]);
return p;
}

void Print(NODE *p)
{//通过中序输出得到的是递增有序的数
if (p!=NULL)
{
Print(p->lchild);
cout << p->data;
Print(p->rchild);
}
}
NODE *FindMin(NODE *p)//查找最小的点
{
if (p == NULL)
return NULL;
if (p->lchild == NULL)
return p;
else
return FindMin(p->lchild); //由于左子树永远小于右子树,所以只需要遍历左边的
}
NODE* Del(NODE *p, int x)
{//删除有三种情况:1)没有子节点 2)有一个子节点 3)有两个子节点

if (p == NULL)
return NULL;
else
{
if (x < p->data)
p->lchild=Del(p->lchild, x);
else if (x > p->data)
p->rchild=Del(p->rchild, x);
else if (p->data == x)
{
NODE *temp = p;
if (p->lchild == NULL&&p->rchild == NULL)
{	//如果左右节点均不存在,则直接删除
free(p);
p = NULL;
}
//若存在一个子节点,则把子节点的地址赋值给删除的那块节点
else if (p->lchild != NULL&&p->rchild == NULL)
{
p = p->lchild;
free(temp);
}
else if (p->lchild == NULL&&p->rchild != NULL)
{
p = p->rchild;
free(temp);
}
else if (p->lchild != NULL&&p->rchild != NULL)
{
//如果左右节点都存在,则找到右子树中最小的节点并代替它
temp = FindMin(p->rchild);
p->data = temp->data;
p->rchild=Del(p->rchild, p->data);
}
}

}
return p;
}
int main(void)
{
NODE*a=(NODE*)malloc(sizeof(NODE));
a = NULL;
int n[6] = { 3,4,1,6,5,2 };
a=Create(a,n,6); //将n数组中的值依次插入

Del(a, 5);
Print(a);

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: