二叉树的定义及相关操作

一.二叉树的定义

二叉树是(n>=0)个结点的有限集,它或者是空集(n=0)或者由一个根节点及两颗互不相交的分别称作这个根的左子树和右子树的二叉树组成

特点:
1.每个结点最多有两个孩子(二叉树中不存在度大于2的结点)

2子树有左右之分,顺序不能颠倒

3.二叉树可以是空集合

与树的区别:

二叉树结点的子树要区分左右孩子,即使只有一棵树也要进行区分它是左子树还是右子树

树当结点只有一个结点时就无须区分它是左还是右次序。因此二者不同,这是二叉树与树最大的区别

二.图示

三.代码

1.二叉树的定义

typedef struct BTnode{
	char element;
	struct BTnode *left;
	struct BTnode *right;
}BTnode,*BTnodePtr;

typedef struct BTnodePtrQueue{
	BTnodePtr *nodePtrs;
	int front;
	int rear;
}BTNodePtrQueue,*QueuePtr;

 2.初始化

//初始化 
QueuePtr Initialqueue()
{
	QueuePtr resultPtr=(QueuePtr)malloc(sizeof(struct BTnodePtrQueue));
	resultPtr->nodePtrs=(BTnodePtr)malloc(sizeof(struct BTnode));
	resultPtr->front =0;
	resultPtr->rear =1;
	return resultPtr;
}

3.队列相关操作

int isQueueEmpty(QueuePtr paraQueuePtr)
{
	if((paraQueuePtr->front +1)%QUEUE_MAX==paraQueuePtr->rear )
	return 1;
}
//入队
void enqueue(QueuePtr paraQueuePtr,BTnodePtr paraBTnodePtr)
{
	printf("The front is %d,The rear is %d\n",paraQueuePtr->front,paraQueuePtr->rear );
	if((paraQueuePtr->rear+1)%QUEUE_MAX==paraQueuePtr->front%QUEUE_MAX){
		printf("Error,trying to enqueue %c.queue full.\r\n",paraBTnodePtr->element );
		return;
	}
	paraQueuePtr->nodePtrs [paraQueuePtr->rear ]=paraBTnodePtr;
	paraQueuePtr->rear =(paraQueuePtr->rear +1)%QUEUE_MAX;
	printf("enqueue %c ends\r\n",paraBTnodePtr->element);
 } 
 //删除元素
BTnodePtr dequeue(QueuePtr paraQueuePtr)
{
	if(isQueueEmpty(paraQueuePtr)==1)
	{
		printf("Erroy Empty\r\n");
		return NULL;
	}
	paraQueuePtr->front =(paraQueuePtr->front +1)%QUEUE_MAX;
	//BTnodePtr tempPtr=(paraQueuPtr->nodePtrs[paraQueuePtr->front +1];
	printf("dequeue %c ends\r\n",paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
	return paraQueuePtr->nodePtrs [paraQueuePtr->front ];
 } 

4.层次遍历

BTnodePtr construct(char paraChar)
 {
 	BTnodePtr resultPtr=(BTnodePtr)malloc(sizeof(BTnode));
 	resultPtr->element =NULL;
 	resultPtr->left =NULL;
 	resultPtr->right =NULL;
 	return resultPtr;
  } 
  
BTnodePtr stringToBTress(char *paraString){
	int i;
	char ch;
	QueuePtr tempQueuePtr=Initialqueue();
	BTnodePtr resultHeader;
	BTnodePtr tempParent,tempLeftChlid,tempRightChild;
	i=0;
	ch=paraString[i];
	resultPtr=comstruct(ch);
	enqueue(tempQueuePtr,resultHeader);
	while(!isQueueEmpty(tempQueuePtr)){
		tempParent=dequeue(tempQueuePtr);
		i++;
		ch=paraString[i];
		if(ch=='#')
		{
			tempParent->left=NULL;
		}
		else{
			tempLeftChlid=construct(ch);
			enqueue(tempQueuePtr,templeftChlid);
			tempParent->left =tempLeftChlid;
		}
		i++;
		ch=paraString[i];
		if(ch=='#'){
			tempParent->right =NULL;
		}else{
			tempRightChild=construct(ch);
			enqueue(tempQueuePtr,tempRightChild);
			tempParent->right =tempRightChild;
		}
	}
	return resultHeader;
}

void levelwise(BTnodePtr paraTreePtr)
{
	char tempString[100];
	int i=0;
	QueuePtr tempQueueuPtr=Initialqueue();
	BTnodePtr tempNodePtr;
	enqueue(tempQueuePtr,paraTreePtr);
	while(!isQueueEmpty(tempQueuePtr)){
		tempNodePtr=dequeue(tempQueuePtr);
		tempString[i]=tempNodePtr->element ;
		i++;
		if(tempNodePtr->left!=NULL){
			enqueue(tempQueuePtr,tempNodePtr->left );
		}
		if(tempNodePtr->right!=NULL){
			enqueue(tempQueuePtr,tempNodePtr->right);
		}
		
	}
	tempString[i]='\0';
	printf("Levelwise: %s\r\n",tempString);
}

5.先序遍历

void preorder(BTnodePtr tempPtr)
{
	if(tempPtr==NULL)
	{
		return;
	}
	printf("%c",tempPtr->element );
	preorder(tempPtr->left );
	preorder(tempPtr->right );
 } 

6.中序遍历

void inorder(BTnodePtr tempPtr)
 {
 	if(tempPtr==NULL)
 	{
 		return;
	 }
	 inorder(tempPtr->left );
	 printf("%c",tempPtr->element );
	 inorder(tempPtr->right );
  } 

7.后续遍历

void postorder(BTnodePtr tempPtr)
{
	if(tempPtr==NULL)
	{
		return;
	}
	postorder(tempPtr->left );
	postorder(tempPtr->right);
	printf("%c",tempPtr->element );
 }

8.完整代码

#include <stdio.h>
#include <stdlib.h>
#define QUEUE_MAX 5
typedef struct BTnode{
	char element;
	struct BTnode *left;
	struct BTnode *right;
}BTnode,*BTnodePtr;

typedef struct BTnodePtrQueue{
	BTnodePtr *nodePtrs;
	int front;
	int rear;
}BTNodePtrQueue,*QueuePtr;
//初始化 
QueuePtr Initialqueue()
{
	QueuePtr resultPtr=(QueuePtr)malloc(sizeof(struct BTnodePtrQueue));
	resultPtr->nodePtrs=(BTnodePtr)malloc(sizeof(struct BTnode));
	resultPtr->front =0;
	resultPtr->rear =1;
	return resultPtr;
}
//判断是否为空 
int isQueueEmpty(QueuePtr paraQueuePtr)
{
	if((paraQueuePtr->front +1)%QUEUE_MAX==paraQueuePtr->rear )
	return 1;
}
//入队
void enqueue(QueuePtr paraQueuePtr,BTnodePtr paraBTnodePtr)
{
	printf("The front is %d,The rear is %d\n",paraQueuePtr->front,paraQueuePtr->rear );
	if((paraQueuePtr->rear+1)%QUEUE_MAX==paraQueuePtr->front%QUEUE_MAX){
		printf("Error,trying to enqueue %c.queue full.\r\n",paraBTnodePtr->element );
		return;
	}
	paraQueuePtr->nodePtrs [paraQueuePtr->rear ]=paraBTnodePtr;
	paraQueuePtr->rear =(paraQueuePtr->rear +1)%QUEUE_MAX;
	printf("enqueue %c ends\r\n",paraBTnodePtr->element);
 } 
 //删除元素
BTnodePtr dequeue(QueuePtr paraQueuePtr)
{
	if(isQueueEmpty(paraQueuePtr)==1)
	{
		printf("Erroy Empty\r\n");
		return NULL;
	}
	paraQueuePtr->front =(paraQueuePtr->front +1)%QUEUE_MAX;
	//BTnodePtr tempPtr=(paraQueuPtr->nodePtrs[paraQueuePtr->front +1];
	printf("dequeue %c ends\r\n",paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
	return paraQueuePtr->nodePtrs [paraQueuePtr->front ];
 } 
 
 //
 BTnodePtr construct(char paraChar)
 {
 	BTnodePtr resultPtr=(BTnodePtr)malloc(sizeof(BTnode));
 	resultPtr->element =NULL;
 	resultPtr->left =NULL;
 	resultPtr->right =NULL;
 	return resultPtr;
  } 
  
BTnodePtr stringToBTress(char *paraString){
	int i;
	char ch;
	QueuePtr tempQueuePtr=Initialqueue();
	BTnodePtr resultHeader;
	BTnodePtr tempParent,tempLeftChlid,tempRightChild;
	i=0;
	ch=paraString[i];
	resultPtr=comstruct(ch);
	enqueue(tempQueuePtr,resultHeader);
	while(!isQueueEmpty(tempQueuePtr)){
		tempParent=dequeue(tempQueuePtr);
		i++;
		ch=paraString[i];
		if(ch=='#')
		{
			tempParent->left=NULL;
		}
		else{
			tempLeftChlid=construct(ch);
			enqueue(tempQueuePtr,templeftChlid);
			tempParent->left =tempLeftChlid;
		}
		i++;
		ch=paraString[i];
		if(ch=='#'){
			tempParent->right =NULL;
		}else{
			tempRightChild=construct(ch);
			enqueue(tempQueuePtr,tempRightChild);
			tempParent->right =tempRightChild;
		}
	}
	return resultHeader;
}

void levelwise(BTnodePtr paraTreePtr)
{
	char tempString[100];
	int i=0;
	QueuePtr tempQueueuPtr=Initialqueue();
	BTnodePtr tempNodePtr;
	enqueue(tempQueuePtr,paraTreePtr);
	while(!isQueueEmpty(tempQueuePtr)){
		tempNodePtr=dequeue(tempQueuePtr);
		tempString[i]=tempNodePtr->element ;
		i++;
		if(tempNodePtr->left!=NULL){
			enqueue(tempQueuePtr,tempNodePtr->left );
		}
		if(tempNodePtr->right!=NULL){
			enqueue(tempQueuePtr,tempNodePtr->right);
		}
		
	}
	tempString[i]='\0';
	printf("Levelwise: %s\r\n",tempString);
}
//先序遍历
void preorder(BTnodePtr tempPtr)
{
	if(tempPtr==NULL)
	{
		return;
	}
	printf("%c",tempPtr->element );
	preorder(tempPtr->left );
	preorder(tempPtr->right );
 } 
 
 //中序遍历法
 void inorder(BTnodePtr tempPtr)
 {
 	if(tempPtr==NULL)
 	{
 		return;
	 }
	 inorder(tempPtr->left );
	 printf("%c",tempPtr->element );
	 inorder(tempPtr->right );
  } 
  
//后序遍历法
void postorder(BTnodePtr tempPtr)
{
	if(tempPtr==NULL)
	{
		return;
	}
	postorder(tempPtr->left );
	postorder(tempPtr->right);
	printf("%c",tempPtr->element );
 }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值