其实这个题要求 每一层从左往右打印,其实很容易想到BFS算法,这个算法不就是用来层次遍历的吗?如果你对BFS很熟悉的话;但是在写的时候会有个问题,我平常写的都是一个队列出去,但是我发现一个队列肯定不行,所以我想了一下,用一维队列,思路就是把第一层的放在q[0]队列中,然后找与q[0]队列节点链接的子节点,然后把下一层的子节点按照从左往右放入q[1]中,什么时候队列+1呢?如果上一层size()==0&&上一层有子节点,那么才+1;所以思路就这样了:
AC代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > ans;
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
if(!root)return ans;//如果根节点为空
BFS(root);//BFS层次遍历
return ans;
}
void BFS(TreeNode *p){
queue<TreeNode> q[10000];
int i=0;
q[i].push(*p);
int f=0;
vector<int> temp;
while(q[i].size()){
TreeNode *t=&q[i].front();q[i].pop();
temp.push_back(t->val);
if(t->left)q[i+1].push(*(t->left)),f=1;
if(t->right)q[i+1].push(*(t->right)),f=1;
if(f&&q[i].size()==0){//上一层有子节点,并且上一层出队完了
i++;f=0;
ans.push_back(temp);temp.clear();//注意二维vector可以直接加一维的vector
}
}
ans.push_back(temp);
}
};