【剑指Offer】把二叉树打印成多行:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};

思路

看这个题目之前首先来考虑一下,二叉树怎么层次遍历。
关于二叉树的层次遍历是这样的,我们用一个队列去实现层次遍历:
在这里插入图片描述
A入队;
A出队,A的左右节点入队,此时(B,C);
B出队,B的左右节点入队,此时(C,D,E);
C出队,C的左右节点入队,此时(D,E,F,G)。
代码如下:

class Solution {
public:
	vector<int> Print(TreeNode* pRoot) {
		vector<int>res;
		queue<TreeNode*>tmp;
		TreeNode* ptr = nullptr;
		if (pRoot == nullptr)
			return res;
		tmp.push(pRoot);
		while (!tmp.empty()) {
			ptr = tmp.front();
			tmp.pop();
			res.push_back(ptr->val);
			if (ptr->left != nullptr)
				tmp.push(ptr->left);
			if (ptr->right != nullptr)
				tmp.push(ptr->right);
		}
		return res;
	}
};

接下来咱们看咱们这个按层多行输出:
这个思路用基于上面层次遍历的思路,不一样的是我们在每次pop之前记住我们一层压入队列中节点的数目,加入while循环,在循环内加入一个tmp1容器,记录每层节点的val 值。里面的while(i++<len) 循环完一次,表示一层节点出队且压入tmp1容器完成,并且表示他们的左右子节点入队完成(队列中只剩下上层的左右子节点)。具体看代码我会标记出来:

class Solution {
public:
	vector<vector<int> > Print(TreeNode* pRoot) {
		vector<vector<int>>res;
		queue<TreeNode*>tmp;
		TreeNode* ptr=nullptr;
		if (pRoot == nullptr)
			return res;
		tmp.push(pRoot);
		while (!tmp.empty()) {
			vector<int>tmp1;//我们把tmp1设置为临时的vector,只在while内有用,省去了每次要进行清空的操作。
			int i = 0, len = tmp.size();//len表示该层push了几个节点
			while(i++<len){
				ptr = tmp.front();
				tmp.pop();
				tmp1.push_back(ptr->val);//先暂时将每层数据压入tmp1
				if (ptr->left != nullptr)
					tmp.push(ptr->left);
				if (ptr->right != nullptr)
					tmp.push(ptr->right);
			}
			res.push_back(tmp1);//等每层压完之后将tmp1,整个压入res中。
		}
		return res;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章