刷题计划(第6天)
时间:2022.4.21
题数:3
题目类型:搜索与回溯算法
1. 从上到下打印二叉树
利用队列来实现层次遍历
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {//根据函数返回值定义存储结果的变量
vector<int> result;
// 定义一个队列用于存储节点的数据
queue<TreeNode*> que;
if(root != NULL) que.push(root);
while(!que.empty()) {
/* 计算队列的大小也即有多少个孩子 */
for(int i = 0; i < que.size(); i++) {
/* 获取第一个节点数据 */
TreeNode* node = que.front();
que.pop();
result.push_back(node->val);
if(node->left != NULL) que.push(node->left);
if(node->right != NULL) que.push(node->right);
}
}
return result;
}
};
2.从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
直接拿上一题的代码修改,变成二维数组,然后在循环当中vector一个tmp,
/**
* 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>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> que;
if(root != NULL) que.push(root);
while(!que.empty()) {
int size=que.size();
vector<int> tmp;
for(int i = 0; i < size; i++) {
/* 获取第一个节点数据 */
TreeNode* node = que.front();
que.pop();
tmp.push_back(node->val);
if(node->left != NULL) que.push(node->left);
if(node->right != NULL) que.push(node->right);
}
result.push_back(tmp);
}
return result;
}
};
和上体遍历原理类似,但这个题是easy,上个题是mid
3. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
今天的题好无聊i
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL) return {};
vector<vector<int>> result;
queue<TreeNode*> que;
bool flag=true;
if(root != NULL) que.push(root);
while(!que.empty()) {
int size=que.size();
vector<int> tmp;
for(int i = 0; i < size; i++) {
/* 获取第一个节点数据 */
TreeNode* node = que.front();
que.pop();
tmp.push_back(node->val);
if(node->left != NULL) que.push(node->left);
if(node->right != NULL) que.push(node->right);
}
if (flag){
result.push_back(tmp);
flag = false;
}else{
reverse(tmp.begin(),tmp.end());
result.push_back(tmp);
flag=true;
}
}
return result;
}
};
总结
从上到下打印二叉树(1),(2),(3)