【劍指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;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章