数据结构五:二叉树的层次打印 (采用队列)

一 定义

对二叉树进行从上到下的逐层打印。采用队列对二叉树节点输出顺序进行管理。

二 结构

二叉树节点:

dataleftright

队列节点:队列节点存储的数据类型是二叉树节点指针

datanext

队列数据链:

三 源码


#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的首个节点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值