题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路1:利用二叉树层序遍历的思想。
具体实现: 先设置一个二维数组vec,用来存放每一层的结点值,即val。
若该二叉树是个空树,就返回一个vec。
若不是空树,再设置一个队列用来存放结点。一开始将根结点入队。
当队列非空的时候,需要在循环内部遍历。另外设置两个变量分别为队首lo和队尾hi。再设置一个一维数组c,用来存放每层的结点。
每遍历一个结点的时候,队首需要+1,所以在循环内部再设置一个循环。
设置一个结点变量*t等于队列中的队首结点,将该结点值加入到一维数组中,并将结点出队。
若该结点有左孩子,将左孩子加入队列;若该节点有右孩子,将右孩子加入队列。
当从队首遍历到队尾,退出循环。将一维数组中保存的结点值,加入到二维数组中。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> vec;
if(pRoot==NULL) return vec;
queue<TreeNode *> q;
q.push(pRoot);
while(!q.empty()) {
int lo=0,hi=q.size();
vector<int> c;
while(lo++ < hi) {
TreeNode *t=q.front();
q.pop();
c.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
vec.push_back(c);
}
return vec;
}
};
思路二:思路基本和思路一一样,但是少了变量、
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ret;
queue<TreeNode*> que;
if(pRoot) que.push(pRoot);
while(!que.empty()){
vector<int> tmp;
int n = que.size();
while(n--){
TreeNode* node = que.front();
tmp.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
que.pop();
}
ret.push_back(tmp);
}
return ret;
}
};
思路三:两个队列交错打印
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> vec;
if(pRoot==NULL) return vec;
queue<TreeNode *> q1;
queue<TreeNode *> q2;
q1.push(pRoot);
while(!q1.empty() || !q2.empty()) {
vector<int> v1;
vector<int> v2;
while(!q1.empty()) {
v1.push_back(q1.front()->val);
if(q1.front()->left!=NULL) q2.push(q1.front()->left);
if(q1.front()->right!=NULL) q2.push(q1.front()->right);
q1.pop();
}
if(v1.size()!=0)
vec.push_back(v1);
while(!q2.empty()) {
v2.push_back(q2.front()->val);
if(q2.front()->left!=NULL) q1.push(q2.front()->left);
if(q2.front()->right!=NULL) q1.push(q2.front()->right);
q2.pop();
}
if(v2.size()!=0)
vec.push_back(v2);
}
return vec;
}
};
拥抱明天!
不给自己做枷锁去限制自己。
别让时代的悲哀,成为你人生的悲哀。

浙公网安备 33010602011771号