515. 在每个树行中找最大值
输入:
1
/ \
3 2
/ \ \
5 3 9
输出: [1, 3, 9]
BFS
每层进行一次遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> largestValues(TreeNode root) {
//BFS遍历每一行,然后找到最大值
Queue<TreeNode> queue = new LinkedList<>();//LinkedList实现队列
List<Integer> result = new ArrayList<>();//存储每一层的最大值
if(root!=null) queue.add(root);//入队
while(!queue.isEmpty()){
int max = Integer.MIN_VALUE;
int levelSize = queue.size();//每一层节点的数量
for(int i=0;i<levelSize;i++){
TreeNode node = queue.poll();//出队,定义好节点变量接收
max = Math.max(max,node.val);
if(node.left!=null){ queue.add(node.left); }//左右节点入队
if(node.right!=null){ queue.add(node.right); }//左右节点入队
}
result.add(max);//每次for循环找出每层的最大值
}
return result;
}
}
DFS
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> largestValues(TreeNode root) {
//DFS深度优先遍历,level记录树的深度(层数)
//定义res(底层数组结构),第1个数据存储第一层深度的最大值,
//第2个数据存储第2层深度的最大值...类推
List<Integer> res = new ArrayList<>();
dfs(root,res,1);
return res;
}
//定义DFS函数
private void dfs(TreeNode root,List<Integer> res,int level){
if(root==null)return;
if(level==res.size()+1){//直接将下一层第一个新节点,加入到res
res.add(root.val);
}
else{//否则要找同样深度的节点最大值
//注意:我们的level是从1开始的,也就是说root
// 是第一层,而集合list的下标是从0开始的,
// 所以这里level要减1。
// Math.max(res.get(level - 1), root.val)表示的
// 是遍历到的第level层的root.val值和集合中的第level
// 个元素的值哪个大,就要哪个。
res.set(level-1,Math.max(res.get(level-1),root.val));
}
//DFS核心代码
dfs(root.left,res,level+1);
dfs(root.right,res,level+1);
}
}
参考
作者:sdwwld Leecode题解