一 定义
对二叉树进行从上到下的逐层打印。采用队列对二叉树节点输出顺序进行管理。
二 结构
二叉树节点:
data | left | right |
队列节点:队列节点存储的数据类型是二叉树节点指针
data | next |
队列数据链:
三 源码
#include <ioStream>
// 二叉树
typedef struct Tree {
char data;
Tree* leftNode;
Tree* rightNode;
};
// 队列
typedef struct Queue {
Tree* data;
Queue* next;
};
Tree* initTree(char* string, int* index) {
if (!string) {
return NULL;
}
char value = string[*index];
(*index)++;
// 递归终止条件
if (value == '#') {
return NULL;
}
Tree* tree = new Tree();
tree->data = value;
tree->leftNode = initTree(string, index);
tree->rightNode = initTree(string, index);
return tree;
}
void queuePush(Queue* queue, Tree* tree) {
Queue* newQueue = new Queue();
newQueue->data = tree;
newQueue->next = NULL;
// 获取队列最后一个节点 并赋值新节点
Queue* currentNode = queue;
while (currentNode->next)
{
currentNode = currentNode->next;
}
currentNode->next = newQueue;
}
Tree* queuePop(Queue* queue) {
Queue* currentQueue = queue->next;
Tree* tree = NULL;
if (currentQueue) {
queue->next = currentQueue->next;
tree = currentQueue->data;
delete currentQueue;
return tree;
}
return tree;
}
void printQueue(Queue* queue) {
Queue* currentQueue = queue->next;
while (currentQueue)
{
printf("%c ", currentQueue->data->data);
currentQueue = currentQueue->next;
}
}
void prePrintTree(Tree* tree) {
if (tree)
{
printf("%c ", tree->data);
prePrintTree(tree->leftNode);
prePrintTree(tree->rightNode);
}
}
void layerPrintTree(Tree* tree, Queue* queue) {
while (tree) {
printf("tree:%c ", tree->data);
// 根据打印节点添加节点
if (tree->leftNode) {
queuePush(queue, tree->leftNode);
}
if (tree->rightNode) {
queuePush(queue, tree->rightNode);
}
// 弹出节点
tree = queuePop(queue);
}
}
int main()
{
char* str = (char*)"ABD##E##CF##G##";
int index = 0;
Tree* node = initTree(str, &index);
Queue* queue = new Queue();
layerPrintTree(node, queue);
printf("\n");
prePrintTree(node);
printf("\n");
}
四 总结
1 层次打印是对输出顺序的重新整理,这种思路可以用于其它类型的顺序输出
2 队列根据当前打印,将打印节点的子节点不断添加到队列中,然后将打印节点调整为pop的节点,直到pop的节点数据为null。第一次打印的节点为根节点,可以理解为它是队列已经pop的首个节点。