28、树与二叉树的应用

树与二叉树的应用

一、二叉查找树

  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、相关算法

  

  

   

 

posted @ 2017-07-07 18:00  樱桃挚爱丸子  阅读(245)  评论(0编辑  收藏  举报