二叉树的构建和遍历

二叉树的遍历有四种:先序排序,中序排序,后序排序,层次排序。

1、先序排序:

2、 中序排序:

3、后序排序:

4、层次排序:

5、二叉树的代码构建

(1)初始化队列

#include<stdio.h>
#include<malloc.h>

#define QUEUE_SIZE 5


//创建二叉树结点
typedef struct BTnode
{
	
	char element;//存储数据。 
	BTnode*left;//左分支 
	BTnode*right;//右分支 
 } BTnode,*BTnodePtr;
 
 //创建队列
 
 typedef struct BTnodePtrQueue
 {
 	BTnodePtr* nodePtrs;
 	int front;
 	int rear;
 	
 	
  } BTnodePtrQueue,*QueuePtr;
  
  
  
  //初始化队列
  
  QueuePtr initQueue()
  {
  	
  	
  	QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(BTnodePtrQueue));
  	resultQueuePtr->nodePtrs = (BTnodePtr*)malloc(QUEUE_SIZE * sizeof(BTnodePtr));
  	resultQueuePtr->front = 0;
  	resultQueuePtr->rear = 1;
  	return resultQueuePtr;
   } 
   
   //判断队列是否为空?
   
   bool isQueueempty(QueuePtr paraQueuePtr)
   {
   	
   	if((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear)
   	{
   		return true;
	   }
	   
	   return false;
   	
	} 

(2)遍历

	 //遍历
	 
	 BTnodePtr dequeue(QueuePtr paraQueuePtr)
	 {
	 	if(isQueueempty(paraQueuePtr))
	 	{
	 		printf("error! empty queue\r\n");
	 		return NULL;
	 		
		 }
		 paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;
		 BTnodePtr tempPtr = paraQueuePtr->nodePtrs[paraQueuePtr->front];
	  } 
	  
	  //
	  
	  BTnodePtr constructBTnode(char parachar)
	  {
	  	BTnodePtr resultPtr = (BTnodePtr)malloc(sizeof(BTnode));
	  	resultPtr->element = parachar;
	  	resultPtr->left = NULL;
	  	resultPtr->right = NULL;
	  	return resultPtr;
	  }
	  
	  
	  //
	  
	  
	  BTnodePtr stringtoBTtree(char *parastring)
	  {
	  	int i;
	  	char ch;
	  	
	  	
	  	QueuePtr tempQueuePtr = initQueue();
	  	
	  	BTnodePtr resultHeader;
	  	BTnodePtr tempParent,tempLeftchild,tempRightchild;
	  	i = 0;
	  	ch = parastring[i];
	  	resultHeader = constructBTnode(ch);
	  	enqueue(tempQueuePtr, resultHeader);
	  	
	  	while(!isQueueempty(tempQueuePtr))
	  	{
	  		tempParent = dequeue(tempQueuePtr);
	  		
	  		//left child
			i++;
			ch = parastring[i];
			if(ch == '#')
			{
				tempParent->left = NULL;
					   }  		 
					   else
					   {
					   	tempLeftchild = constructBTnode(ch);
					   	enqueue(tempQueuePtr, tempLeftchild);
					   	tempParent->left = tempLeftchild;
					   }
					   
			//right child
			i++;
			ch = parastring[i];
			if(ch == '#')
			{
				tempParent->right = NULL;
					   }
					   
					   else
					   {
					   	tempRightchild = constructBTnode(ch);
					   	enqueue(tempQueuePtr, tempRightchild);
					   	tempParent->right = tempRightchild;
								  }		   
					    }
					    return resultHeader;
	  }
	  
	  
	  //
	  
	  void levelwise(BTnodePtr paraTreePtr)
	  {
	  	char tempstring[100];
	  	int i = 0;
	  	QueuePtr tempQueuePtr = initQueue();
	  	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 ;
	  	}
	  	
	  	 printf("%c",tempPtr->element);
		  postorder(tempPtr->left);
		   postorder(tempPtr->right);
	   }
	   
	   //
	   
	   
	   int main()
	   {
	   	BTnodePtr tempHeader;
	   	tempHeader = constructBTnode('c');
	   	printf("there is only one node. Preorder visit: ");
	   	preorder(tempHeader);
	   	printf("\r\n");
	   	
	   	char* tempstring = "acde#bf######";
	   	
	   	tempHeader  = stringtoBTtree(tempstring);
	   	printf("inorder:");
	   	inorder(tempHeader);
	   	printf("\r\n");
	   	
	   	printf("preorder:");
	   	preorder(tempHeader);
	   	printf("\r\n");
	   	
	   	printf("postorder:");
	   	postorder(tempHeader);
	   	printf("\r\n");
	   	
	   	printf("levelwise:");
	   	levelwise(tempHeader);
	   	printf("\r\n");
	   	
	   	return 1;
	   }

3、运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值