剑指offer——分行从上到下打印二叉树(32题)

题目:分行从上到下打印二叉树,从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印至一行。

解决二叉树的遍历问题无外乎就是三种遍历方法,此处增加了按层遍历的条件,即广度优先遍历。解决广度优先遍历,首先想到运用队列。同理,解决深度优先遍历,首先想到到家用递归。想必这是常识,应形成条件反射。

该题目的特点是分行哈,可通过设置每行元素个数标志来实现。具体代码见下:

#include<iostream>
#include<queue>

using namespace std;

/*
分行从上到下打印二叉树(特点是分行哈,可通过设置每行元素个数标志来实现)
*/
struct TreeNode {
	int val;
	TreeNode* left, *right;
	TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};

void print(TreeNode* root) {
	if (!root)
		return;
	queue<TreeNode*> nodes;
	nodes.push(root);
	int nextLevel = 0;//统计每行的元素个数
	int toBePrinted = 1;//每输出一行的一个元素时,将值减1,直至为0时,进行换行
	while (!nodes.empty()) {
		TreeNode* cur = nodes.front();
		nodes.pop();
		cout << cur->val << " ";
		if (cur->left) {
			nodes.push(cur->left);
			++nextLevel;//遍历到每一行的元素时,其行内的元素总个数进行加1
		}
		if (cur->right) {
			nodes.push(cur->right);
			++nextLevel;
		}
		--toBePrinted;//每输出一个行内元素时,将个数进行减1

		if (toBePrinted == 0) {//表有该换行啦
			cout << endl;
			toBePrinted = nextLevel;
			nextLevel = 0;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值