剑指offer 32 - 1. 从上到下打印二叉树
思路
因为要层序遍历,所以就不好采用递归的方法来实现。所以借用queue
来实现层序遍历。
首先将root节点放入queue中,然后当queue不为空时进行循环。其中首先记录queue的顶部的数值,然后放到ans中输出。然后判断当前头节点的左右子节点是否为空,如果不为空就放入queue中。直到queue成为一个空队列,说明遍历结束,输出ans数组。
代码
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
vector<int> ans;
if(root == NULL){
return ans;
}
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
TreeNode* temp = que.front();
ans.push_back(temp->val);
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
que.pop();
}
return ans;
}
};
剑指offer 32 - 2. 从上到下打印二叉树
思路
和上一题类似,需要层序遍历,但是改为每一层分别用一个vector来存储。
所以在判断queue是否为空之后,先获取当前queue中的节点个数,这个数量表示这一层需要添加左右子节点的节点数,然后根据这个size数量来进行循环,将每一层的vector都push到ans中。最后输出ans。
代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == NULL){
return ans;
}
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
vector<int> res;
int size = que.size();
while(size--){
TreeNode* temp = que.front();
res.push_back(temp->val);
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
que.pop();
}
ans.push_back(res);
}
return ans;
}
};
剑指offer 32 - 3. 从上到下打印二叉树
思路
一样是层序遍历,需要做的就是控制从左到右还是从右到左,这个通过一个flag来控制。
需要注意的是,每一行的val值不再通过vector来进行存储,因为vector只能push_back,这里采用deque双向队列来实现,deque能够实现push_back和push_front。
然后通过vector<int>把deque的类型进行强转,存入ans
代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == NULL){
return ans;
}
queue<TreeNode*> que;
que.push(root);
bool flag = 1;
while(!que.empty()){
int size = que.size();
deque<int> res;
while(size--){
TreeNode* temp = que.front();
if(flag == 1){
res.push_back(temp->val);
}
else{
res.push_front(temp->val);
}
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
que.pop();
}
flag = !flag;
ans.push_back(vector<int>(res.begin(),res.end()));
}
return ans;
}
};