題目描述
從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
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;
}
};