两道题思路基本一致,要有一个变量记录当前层节点的数量
- 从上到下打印:(标准的BFS)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int>ans;
if (root==nullptr)return ans;
queue<TreeNode*>q;
q.push(root);
while(!q.empty())
{
TreeNode* tmp = q.front();
q.pop();
ans.push_back(tmp->val);
if (tmp->left)q.push(tmp->left);
if (tmp->right)q.push(tmp->right);
}
return ans;
}
};
- 多行打印: (多了变量,cnt记录当前层剩余的、cnt_tmp记录下一层的节点数)
/*
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> >ans;
if (pRoot==nullptr)return ans;
queue<TreeNode*>q;
q.push(pRoot);
int cnt = 1;
int cnt_tmp = 0;
vector<int>one;
while(!q.empty())
{
TreeNode* tmp = q.front();
q.pop();
one.push_back(tmp->val);
cnt--;
if (tmp->left)
{
q.push(tmp->left);
cnt_tmp++;
}
if (tmp->right){
q.push(tmp->right);
cnt_tmp++;
}
if (cnt==0)
{
ans.push_back(one);
cnt = cnt_tmp;
cnt_tmp = 0;
one.clear();
}
}
return ans;
}
};
- 之字形打印
可以用两个栈,存相邻的层。入栈顺序不同,记录奇偶。
/*
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> >ans;
if(pRoot==nullptr)return ans;
stack<TreeNode*>s1;
stack<TreeNode*>s2;
s1.push(pRoot);
vector<int>first_vector;
int flag = 0;
int cnt = 1;
int cnt_tmp= 0;
while(!s1.empty() || !s2.empty())
{
if (flag==0 && !s1.empty())
{
TreeNode* node_tmp = s1.top();
s1.pop();
cnt--;
first_vector.push_back(node_tmp->val);
if (node_tmp->left)s2.push(node_tmp->left);
if (node_tmp->right)s2.push(node_tmp->right);
}
if (flag==1 && !s2.empty())
{
TreeNode* node_tmp = s2.top();
s2.pop();
cnt--;
first_vector.push_back(node_tmp->val);
if (node_tmp->right)s1.push(node_tmp->right);
if (node_tmp->left)s1.push(node_tmp->left);
}
if (cnt==0)
{
if (flag==1)
{
flag = 0;
cnt_tmp = s1.size();
}
else if (flag==0)
{
flag = 1;
cnt_tmp = s2.size();
}
cnt = cnt_tmp;
if (first_vector.size()!=0)ans.push_back(first_vector);
first_vector.clear();
}
}
return ans;
}
};