树与二叉树的应用
一、二叉查找树
1、二叉查找树的类型定义
//二叉查找树的类型定义
typedef int DataType; //结点关键码的数据类型
typedef struct node
{
DataType data; //结点的数据值
struct node * lchild, *rchild; //指向左、右子女结点的指针
}BSTNode, *BSTree;
2、二叉查找树的相关操作
//二叉查找树上的查找
BSTNode * Search (BSTree root, DataType x,BSTNode * & father)
{
BSTNode * P = root;
father = NULL; //father是查找结点的父结点
while(p != NULL && p->data != x) //寻找包含x的结点
{
father = p; //不等,向下层继续查找
if(x < p->data) //x小于根,向左子树继续查找
p = p->lchild;
else
p = p->rchild; //否则向右子树继续查找
}
return p;
}
//二叉查找树的插入
int Insert (BSTree & root, DataType x)
{
BSTNode * s, * p, * f;
p = Search (root,x,f); //寻找插入位置
if (p != NULL)
return 0; //查找成功,不插入
s = new BSTNode; //否则,新结点插入
if(s == NULL)
return 0;
s->data = x;
s->lchild = NULL;
s->rchild = NULL;
if(f == NULL) //空树,新结点为根结点
root = s;
else if(x < f->data) //x小于f,作为左子女插入
f->lchild = s;
else //否则,作为右子女插入
f->rchild = s;
return 1;
}
//二叉查找树的删除
int Remove(BSTree & root, DataType x)
{
BSTNode * s, * p, * f;
p = Search (root,x,f); //寻找删除的结点
if (p == NULL)
return 0; //查找失败,不作删除
if(p->lchild != NULL && p->rchild != NULL)
{
s = p->lchild; //有双子女,找 *p的中序前趋 *s
while(s->rchild != NULL)
{
f = s;
s = s->rchild;
}
p->data = s->data;
p = s; //用 *s的值取代 *p的值,再删 *s
}
if(p -> lchild != NULL) //左子树非空,记下左子女结点
s = p->lchild; //记下右子女结点
else
s = p->rchild;
if(p == root) //被删结点为根结点
root = s;
else if(s->data < f->data) //父结点直接链接子女结点
f->lchild = s;
else
f->lchild = s;
delete p;
return 1;
}
3、相关算法