二叉樹的基本運算

//二叉樹的初始化操作。二叉樹的初始化需要將指向二叉樹的根結點指針置爲空:
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;
}

發佈了94 篇原創文章 · 獲贊 29 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章