码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的基本运算

时间:2015-07-25 23:07:13      阅读:488      评论:0      收藏:0      [点我收藏+]

标签:二叉树

//二叉树的初始化操作。二叉树的初始化需要将指向二叉树的根结点指针置为空:
void InitBitTree(BiTree *T)//二叉树的初始化操作
{
	*T=NULL;
}
//二叉树的销毁操作。如果二叉树存在,将二叉树存储空间释放:

void DestroyBitTree(BiTree *T)//销毁二叉树操作
{
	if(*T)//如果是非空二叉树
	{
		if((*T)->lchild)
			DestroyBitTree(&((*T)->lchild));
		if((*T)->rchild)
			DestroyBitTree(&((*T)->rchild));
		free(*T);
		*T=NULL;
	}
}
//创建二叉树操作。根据二叉树的递归定义,先生成二叉树的根结点,将元素值赋给结点的数据域,然后递归创建
//左子树和右子树。其中‘#’表示空:

void CreatBitTree(BiTree *T)//递归创建二叉树
{
	DataType ch;
	scanf("%c",&ch);
	if(ch=='#')
		*T=NULL;
	else
	{
		*T=(BiTree)malloc(sizeof(BitNode));//生成根结点
		if(!(*T))
			exit(-1);
		(*T)->data=ch;
		CreatBitTree(&((*T)->lchild));
		CreatBitTree(&((*T)->rchild));
	}
}
//二叉树的左插入操作。指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的左子树
//,p指向结点的原来左子树成为c的右子树:


int InsertLeftChild(BiTree p,BiTree c)//二叉树的左插入操作
{
	if(p)//如果指针p不空
	{
		c->rchild=p->lchild;//p的原来的左子树成为c的右子树
		p->lchild=c;//子树c作为p的左子树
		return 1;
	}
	return 0;
}
//二叉树的右插入操作。指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的右子树
//,p指向结点的原来右子树成为c的右子树:

int InsertRightChild(BiTree p,BiTree c)//二叉树的右插入操作
{
	if(p)//如果指针p不空
	{
		c->rchild=p->rchild;//p的原来的右子树成为c的右子树
		p->rchild=c;//子树c作为p的右子树
		return 1;
	}
	return 0;
}
/*返回二叉树结点的指针操作。在二叉树中查找指向元素值为e的结点,如果找到该结点,则将该结点的指针
返回,否则,返回NULL。
具体实现:定义一个队列Q,用来存放二叉树中结点的指针,从根结点开始,判断结点的值是否等于e,如果
相等,则返回该结点的指针;否则,将该结点的左孩子结点的指针和右孩子结点的指针入队列。如果结点存在
左孩子结点,则将其左孩子的指针入队列;如果结点存在右孩子结点,则将其右孩子的指针入队列。然后将
队头的指针出队列,判断该指针指向的结点的元素值是否等于e,如果相等,则返回该结点的指针,否则,继续
将结点的左孩子结点的指针和右孩子结点的指针入队列。重复此操作,直到队列为空。*/


BiTree Point(BiTree T,DataType e)//查找元素值为e的结点的指针
{
	BiTree Q[MAXSIZE];//定义一个队列,用于存放二叉树中结点的指针
	int front=0,rear=0;//初始化队列
	BitNode *p;
	if(T)//如果二叉树非空
	{
		Q[rear]=T;
		rear++;
		while(front!=rear)//如果队列非空
		{
			p=Q[front];//取出队头指针
			front++;//将队头指针出队
			if(p->data==e)
				return p;
			if(p->lchild)//如果左孩子结点存在,将左孩子指针入队
			{
				Q[rear]=p->lchild;//左孩子结点的指针入队
				rear++;
			}
            if(p->rchild)//如果右孩子结点存在,将右孩子指针入队
			{
				Q[rear]=p->rchild;//右孩子结点的指针入队
				rear++;
			}
		}
	}
	return NULL;
}  
//返回二叉树的结点的左孩子元素值操作。如果元素值为e的结点存在,并且该结点的左孩子结点存在,则将
//该结点的左孩子结点的元素值返回。

DataType LeftChild(BiTree T,DataType e)//返回二叉树的左孩子结点元素值操作
{
	BiTree p;
	if(T)//如果二叉树非空
	{
		p=Point(T,e);//p是元素值e的结点的指针
		if(p&&p->lchild)//如果p不为空且p的左孩子结点存在
			return p->lchild->data;
	}
	return;
}
//返回二叉树的结点的右孩子元素值操作。如果元素值为e的结点存在,并且该结点的右孩子结点存在,则将
//该结点的右孩子结点的元素值返回。

DataType RightChild(BiTree T,DataType e)//返回二叉树的右孩子结点元素值操作
{
	BiTree p;
	if(T)//如果二叉树非空
	{
		p=Point(T,e);//p是元素值e的结点的指针
		if(p&&p->rchild)//如果p不为空且p的右孩子结点存在
			return p->rchild->data;
	}
	return;
}
//二叉树的左删除操作。在二叉树中,指针p指向二叉树中的某个结点,将p所指向的结点的左子树删除。如果删除
//成功,返回1,否则返回0.

int DeleteLeftChild(BiTree p)//二叉树的左删除操作
{
	if(p)//如果指针p不空
	{
		DestroyBitTree(&(p->lchild));//删除左子树
		return 1;
	}
	return 0;
}


//二叉树的右删除操作。在二叉树中,指针p指向二叉树中的某个结点,将p所指向的结点的右子树删除。如果删除
//成功,返回1,否则返回0.
int DeleteRightChild(BiTree p)//二叉树的右删除操作
{
	if(p)//如果指针p不空
	{
		DestroyBitTree(&(p->rchild));//删除右子树
		return 1;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉树的基本运算

标签:二叉树

原文地址:http://blog.csdn.net/weichanjuan3/article/details/47060145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!