二叉树的层次遍历,基于队的数据结构来实现。
基于如图二叉树:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EMPTY 1
#define NONEMPTY 0
typedef struct TreeNode
{
char data;
struct TreeNode *leftChild;
struct TreeNode *rightChild;
} TreeNode;
typedef struct QueueNode
{
TreeNode *data;
struct QueueNode *pre;
struct QueueNode *next;
} QueueNode;
void createTree(TreeNode **T, const char *data, int *index) // 以先序遍历创建
{
char ch;
ch = data[*index];
(*index)++;
if (ch == '#') // 此时为空节点
{
*T = NULL;
}
else // 此时不为空
{
*T = (TreeNode *)malloc(sizeof(TreeNode));
(*T)->data = ch;
createTree(&((*T)->leftChild), data, index);
createTree(&((*T)->rightChild), data, index);
}
}
void preQrder(TreeNode *T)
{
if (T == NULL)
{
return;
}
else
{
printf("%c ", T->data); // 遍历根节点 -- 这个是真打印的!
preQrder(T->leftChild); // 遍历左子树
preQrder(T->rightChild); // 遍历右子树
}
}
QueueNode *initQueue()
{
QueueNode *queue = (QueueNode *)malloc(sizeof(QueueNode));
if (queue == NULL)
{
printf("malloc queue error\n");
}
queue->data = NULL;
queue->next = queue;
queue->pre = queue;
return queue;
}
void enQueue(TreeNode *data, QueueNode *queue)
{
QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode));
if (newNode == NULL)
{
printf("malloc newNode error\n");
}
newNode->data = data;
newNode->pre = queue;
newNode->next = queue;
queue->pre->next = newNode;
queue->pre = newNode;
}
int isEmpty(QueueNode *queue)
{
if (queue->next == queue)
{
return EMPTY;
}
else
{
return NONEMPTY;
}
}
QueueNode *deQueue(QueueNode *queue)
{
if (isEmpty(queue) == EMPTY)
{
return NULL;
}
else
{
QueueNode *node = queue->next;
queue->next->next->pre = queue;
queue->next = queue->next->next;
return node;
}
}
void levelTraverse(QueueNode *queue, TreeNode *T)
{
enQueue(T, queue);
while (isEmpty(queue) == NONEMPTY)
{
QueueNode *node = deQueue(queue);
printf("%c ", node->data->data);
if (node->data->leftChild)
{
enQueue(node->data->leftChild, queue);
}
if (node->data->rightChild)
{
enQueue(node->data->rightChild, queue);
}
}
}
int main(int argc, char const *argv[])
{
TreeNode *T;
int index = 0;
createTree(&T, argv[1], &index);
QueueNode *queue = initQueue();
printf("前序遍历 > ");
preQrder(T);
putchar(10);
printf("----------------------------------------------------------\n");
printf("层次遍历 > ");
levelTraverse(queue, T);
putchar(10);
printf("----------------------------------------------------------\n");
return 0;
}
运行结果如下:
superlan@GodFather:~/C_Language/data_structure$ ./a.out ABD##E##CF##G##
前序遍历 > A B D E C F G
----------------------------------------------------------
层次遍历 > A B C D E F G
----------------------------------------------------------