《慕课网玩转算法面试》笔记及习题解答6.4.~6.6
2017-09-03 23:52
537 查看
leetcode 102
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
return res;
}
练习:
leetcode 107
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
reverse(res.begin(), res.end());
return res;
}
leetcode 103
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
//对于奇数行的数据翻转
for(int i = 1; i < res.size(); i+=2)
reverse(res[i].begin(), res[i].end());
return res;
}
leetcode 199
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时push
if(level == res.size()){
res.push_back(node->val);
}
//当level != res.size()时,说明res[level]已经存在,我们只需要将它覆盖,最后覆盖的值一定是该层最右边的值
else res[level] = (node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
return res;
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
return res;
}
练习:
leetcode 107
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
reverse(res.begin(), res.end());
return res;
}
leetcode 103
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时新建一个vector插入
if(level == res.size()){
vector<int> tmp;
tmp.push_back(node->val);
res.push_back(tmp);
}
else res[level].push_back(node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
//对于奇数行的数据翻转
for(int i = 1; i < res.size(); i+=2)
reverse(res[i].begin(), res[i].end());
return res;
}
leetcode 199
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
if(root == NULL)
return res;
//层序遍历
queue<pair<TreeNode*,int>> q;
//root作为第0层
q.push( make_pair(root,0) );
while(!q.empty()){
TreeNode* node = q.front().first;
int level = q.front().second;
//当level == res.size()时,说明res[level]为空,此时push
if(level == res.size()){
res.push_back(node->val);
}
//当level != res.size()时,说明res[level]已经存在,我们只需要将它覆盖,最后覆盖的值一定是该层最右边的值
else res[level] = (node->val);
if(node->left) q.push( make_pair(node->left ,level+1) );
if(node->right) q.push( make_pair(node->right ,level+1) );
q.pop();
}
return res;
}
相关文章推荐
- 《慕课网玩转算法面试》笔记及习题解答6.7
- 《慕课网玩转算法面试》笔记及习题解答8.1~8.3
- 《慕课网玩转算法面试》笔记及习题解答5.4.~5.6
- 《慕课网玩转算法面试》笔记及习题解答5.1.~5.3
- 《慕课网玩转算法面试》笔记及习题解答3.1 ~3.4
- 《慕课网玩转算法面试》笔记及习题解答9.3
- 《慕课网玩转算法面试》笔记及习题解答1
- 《慕课网玩转算法面试》笔记及习题解答9.8
- 《慕课网玩转算法面试》笔记及习题解答9.4
- 《慕课网玩转算法面试》笔记及习题解答7.4~7.6
- 《慕课网玩转算法面试》笔记及习题解答8.4~8.5
- 《慕课网玩转算法面试》笔记及习题解答3.5~3.6
- 《慕课网玩转算法面试》笔记及习题解答2
- Introduction to Algorithms 算法导论 第3章 函数的增长 学习笔记及习题解答
- 算法笔记_121:蓝桥杯第六届省赛(Java语言C组部分习题)试题解答
- Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答
- 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答
- 算法笔记_110:第四届蓝桥杯软件类省赛真题(JAVA软件开发高职高专组部分习题)试题解答
- 算法笔记_120:蓝桥杯第六届省赛(Java语言B组部分习题)试题解答
- Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答