一.二叉树的定义
二叉树是(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 );
}