数据结构学习——二叉树的构建与遍历


前言——二叉树

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。
在这里插入图片描述
在这里插入图片描述

一、实际操作

1.建立二叉树

typedef struct BTNode
{
	char element;
 	BTNode* left;
 	BTNode* right;
}BTNode, *BTNodePtr;
 
typedef struct BTNodePtrQueue
{
    BTNodePtr* nodePtrs;
  	int front;
  	int rear;
}BTNodePtrQueue, *QueuePtr;

2.初始化

QueuePtr initQueue()
{
   	QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue));
   	resultQueuePtr->nodePtrs = (BTNodePtr*)malloc(QUEUE_SIZE * sizeof(BTNodePtr));
   	resultQueuePtr->front = 0;
   	resultQueuePtr->rear = 1;
   	return resultQueuePtr;
}

3.判断

bool isQueueEmpty(QueuePtr paraQueuePtr)
{
   	if((paraQueuePtr->front + 1)% QUEUE_SIZE == paraQueuePtr->rear)
	{
   	return true;
	}
	
	return false;
}

4.入队

void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr)
{ 
	printf("front = %d, rear = %d.\r\n",paraQueuePtr->front, paraQueuePtr->rear);
	if((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE)
	{
		printf("Error, trying to enqueue %c.queue full.\r\n",paraBTNodePtr->element);
		return;
	}
	paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr;
	paraQueuePtr->rear = (paraQueuePtr->rear +1)% QUEUE_SIZE;
	printf("enqueue %c ends.\r\n",paraBTNodePtr->element);
	}

5.出队

BTNodePtr dequeue(QueuePtr paraQueuePtr)
{
	if(isQueueEmpty(paraQueuePtr)) 
	{
    	printf("Error, empty queue\r\n");
		return NULL;
	}
		
	paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;
	
	printf("dequeue %c ends.\r\n",paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
	return paraQueuePtr->nodePtrs[paraQueuePtr->front];
	}

6.构造节点

BTNodePtr constructBTNode(char paraChar)
{
	BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode));
 	resultPtr->element = paraChar;
 	resultPtr->left = NULL;
 	resultPtr->right = NULL;
 	return resultPtr;
}

7.转化

BTNodePtr stringToBTree(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);
	  
		i++;
  		ch = paraString[i];
  		if(ch = '#')
		{
	  		tempParent->left = NULL;
		}
		else
		{
			tempLeftChild = constructBTNode(ch);
		  	enqueue(tempQueuePtr, tempLeftChild);
		  	tempParent->left = tempLeftChild;
        }

	    i++;
	    ch = paraString[i];
    	if(ch == '#')
		{
			tempParent->right = NULL;
		} 
		else 
		{
		 	tempRightChild = constructBTNode(ch);
			enqueue(tempQueuePtr, tempRightChild);
		 	tempParent->right = tempRightChild;
		} 
	}
		  
    return resultHeader;
}

8.层序遍历

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);
}

9.先序

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

10.中序

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

11.后序

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

12.测试

int main()
{
	BTNodePtr tempHeader;
	tempHeader = constructBTNode('c');
	printf("There is only one node. Preorder visit: ");
	preorder(tempHeader);
	printf("\r\n");
		   	
	char* tempString = "abde#bf######";
		   	
	tempHeader = stringToBTree(tempString);
	printf("Preorder: ");
	preorder(tempHeader);
	printf("\r\n");
	printf("Inorder: ");
	inorder(tempHeader);
	printf("\r\n");
	printf("Postorder: ");
	postorder(tempHeader);
	printf("\r\n");
	printf("Levelwise: ");
	levelwise(tempHeader);
    printf("\r\n");
			
	return 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(struct 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;
}
	

void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr)
{ 
	printf("front = %d, rear = %d.\r\n",paraQueuePtr->front, paraQueuePtr->rear);
	if((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE)
	{
		printf("Error, trying to enqueue %c.queue full.\r\n",paraBTNodePtr->element);
		return;
	}
	paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr;
	paraQueuePtr->rear = (paraQueuePtr->rear +1)% QUEUE_SIZE;
	printf("enqueue %c ends.\r\n",paraBTNodePtr->element);
	}

BTNodePtr dequeue(QueuePtr paraQueuePtr)
{
	if(isQueueEmpty(paraQueuePtr)) 
	{
    	printf("Error, empty queue\r\n");
		return NULL;
	}
		
	paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;
	
	printf("dequeue %c ends.\r\n",paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
	return 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 stringToBTree(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);
	  
		i++;
  		ch = paraString[i];
  		if(ch = '#')
		{
	  		tempParent->left = NULL;
		}
		else
		{
			tempLeftChild = constructBTNode(ch);
		  	enqueue(tempQueuePtr, tempLeftChild);
		  	tempParent->left = tempLeftChild;
        }

	    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;
	}
			  
	postorder(tempPtr->left);
	postorder(tempPtr->right);
	printf("%c",tempPtr->element);
}
		  
int main()
{
	BTNodePtr tempHeader;
	tempHeader = constructBTNode('c');
	printf("There is only one node. Preorder visit: ");
	preorder(tempHeader);
	printf("\r\n");
		   	
	char* tempString = "abde#bf######";
		   	
	tempHeader = stringToBTree(tempString);
	printf("Preorder: ");
	preorder(tempHeader);
	printf("\r\n");
	printf("Inorder: ");
	inorder(tempHeader);
	printf("\r\n");
	printf("Postorder: ");
	postorder(tempHeader);
	printf("\r\n");
	printf("Levelwise: ");
	levelwise(tempHeader);
    printf("\r\n");
			
	return 1; 
}

三、测试结果

There is only one node. Preorder visit: 0,tempPtr->element
front = 0, rear = 1.
enqueue a ends.
dequeue a ends.
front = 1, rear = 2.
enqueue d ends.
dequeue d ends.
Preorder: 0,tempPtr->element0,tempPtr->element
Inorder: ad
Postorder: da
Levelwise: front = 0, rear = 1.
enqueue a ends.
dequeue a ends.
front = 1, rear = 2.
enqueue d ends.
dequeue d ends.
Levelwise: ad
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值