在每个树行中找最大值
题目链接: 力扣题目链接
难度:中等
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例
思路
层序遍历,取每一层的最大值
二叉树结点定义
//二叉树节点的定义。
class TreeNode {
int val;
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> result = new ArrayList<>();
if(root == null){
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int len = queue.size();
List<Integer> list = new ArrayList<>();
for(int i=0;i<len;i++){
TreeNode tempNode = queue.poll();
list.add(tempNode.val);
if(tempNode.left != null) queue.offer(tempNode.left);
if(tempNode.right != null) queue.offer(tempNode.right);
}
result.add(Collections.max(list));
}
return result;
}
}
方式二:递归代码
class Solution{
public List<Integer> result = new ArrayList<>();
public List<Integer> largestValues(TreeNode root) {
largestValues(root,0);
return result;
}
private void largestValues(TreeNode root,Integer deep){
if(root ==null){
return;
}
// 如果result.size() == deep则表示当前层是第一次被访问,当前结点也就是第一次被访问,将该结点值添加到result中
if(result.size() == deep){
result.add(root.val);
// 否则就表示当前结点并不是当前层第一个被访问的,就需要将当前结点值与当前层已经存储过的结点值作比较,以此更新当前层的最大值
}else{
if(result.get(deep) < root.val){
result.set(deep,root.val);
}
}
deep++;
largestValues(root.left,deep);
largestValues(root.right,deep);
}
}