二叉树的遍历有四种:先序排序,中序排序,后序排序,层次排序。
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、运行结果: