1. 题⽬链接:515.在每个树⾏中找最⼤值
2. 题⽬描述:
3. 解法(bfs):
算法思路:
层序遍历过程中,在执⾏让下⼀层节点⼊队的时候,我们是可以在循环中统计出当前层结点的最⼤值 的。 因此,可以在bfs的过程中,统计出每⼀层结点的最⼤值。
C++算法代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
vector<int> largestValues(TreeNode* root)
{
vector<int>answer; //答案
//空树的情况
if(root==nullptr)
{
return answer;
}
queue<TreeNode*>q; //记录每一层的节点
q.push(root);
while(q.size())
{
int max_size=INT_MIN; //记录每一层的最大值
int num=q.size();
//插入后续节点+更新队列
for(int i=0;i<num;i++)
{
TreeNode* key=q.front();
max_size=max(max_size,key->val);
if(key->left)
{
q.push(key->left);
}
if(key->right)
{
q.push(key->right);
}
q.pop();
}
answer.push_back(max_size);
}
return answer;
}
};
Java算法代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
1
2
3
4 * TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution
{
public List<Integer> largestValues(TreeNode root)
{
List<Integer> ret = new ArrayList<>();
if (root == null) return ret;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty())
{
int sz = q.size();
int tmp = Integer.MIN_VALUE;
for (int i = 0; i < sz; i++)
{
TreeNode t = q.poll();
tmp = Math.max(tmp, t.val);
if (t.left != null) q.add(t.left);
if (t.right != null) q.add(t.right);
}
ret.add(tmp);
}
return ret;
}
}