1 题目描述
题目链接:在每个树行中找最大值
2 题目解析
根据题目描述,是找出每一行中的最大值,这毋庸置疑是使用宽度优先遍历了。我在这篇文章中讲解了宽度优先遍历的模板,如果没有看的同学可以先去看一下。
这道题和模板的不同之处在于,需要计算出每一行中的最大值。因此,可以有下面两个思路:
1. 模板中已经拿到了全部的节点值,每一行在vector< int >中,因此可以对每个vector< int >遍历一遍,求出每一行的最大值
2. 在遍历树的过程中出现过对树的每一行都进行遍历的过程,因此可以在遍历树的每一行时找出最大的值
3 代码
3.1 思路1代码
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
vector<int> ret;
queue<TreeNode*> q;
if (root == nullptr)
return ret;
q.push(root);
while(q.size())
{
int m = INT_MIN;
//存储的是每一层的值
vector<int> tmp;
//对于每一层 --> 也可以在这一层里面直接计算出max
int sz = q.size();
for (int i = 0; i < sz; ++ i)
{
TreeNode* t = q.front();
tmp.push_back(t->val);
if (t->left)
q.push(t->left);
if (t->right)
q.push(t->right);
q.pop();
}
//找出这一层中最大的值
for (int i = 0; i < tmp.size(); ++ i)
{
m = max(m, tmp[i]);
}
ret.push_back(m);
}
return ret;
}
};
3.2 思路2代码
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
vector<int> res;
queue<TreeNode*> q;
if (root == nullptr)
return res;
q.push(root);
while(q.size())
{
int sz = q.size();
int m = INT_MIN; //这里m不能为0,因为最小值是-2的31次方
//vector<int> tmp;
for (int i = 0; i < sz; ++ i)
{
TreeNode* t = q.front();
q.pop();
m = max(m, t->val);
if (t->left)
q.push(t->left);
if (t->right)
q.push(t->right);
}
res.push_back(m);
}
return res;
}
};