问题描述
问题链接:https://leetcode.com/problems/find-largest-value-in-each-tree-row/#/description
You need to find the largest value in each row of a binary tree.
Example:
Input:
1
/ \
3 2
/ \ \
5 3 9
Output: [1, 3, 9]
我的代码
整体思路很简单,就是使用广度优先搜索。然后用了两个辅助的标识量用来跟踪当前层数的节点数量和下层的节点数量。
直接上代码。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> largestValues(TreeNode root) {
/*
思路大概是这样,用广度优先遍历,然后在往列表里面加子节点的时候,把下层标识量+1,
当一层遍历完(本层标识量为0),将下层标识量作为本层标识量,然后下层标识量=0,
就可以得到这一层的最大值。
*/
if(root == null){
return new ArrayList<Integer>();
}
List<TreeNode> goList = new ArrayList<TreeNode>();
goList.add(root);
int curDeepLen = 1; // 本层节点数量
int nextDeepLen = 0; // 下层节点数量
int max = Integer.MIN_VALUE; // 当前节点的最大值
List<Integer> maxList = new ArrayList<Integer>();
while(goList.size() > 0){
TreeNode curNode = goList.get(0);
goList.remove(0);
if(curNode.left != null){
nextDeepLen ++;
goList.add(curNode.left);
}
if(curNode.right != null){
nextDeepLen ++;
goList.add(curNode.right);
}
if(curNode.val > max){
max = curNode.val;
}
curDeepLen--;
if(curDeepLen == 0){ // 这一层已经遍历完了
curDeepLen = nextDeepLen;
nextDeepLen = 0;
maxList.add(max);
max = Integer.MIN_VALUE;
}
}
return maxList;
}
}
来看看讨论区的大神们怎么做的。
讨论区
9ms JAVA DFS solution
链接地址:https://discuss.leetcode.com/topic/79178/9ms-java-dfs-solution
这个的思路跟小雨的很像,挺不错的,值得学习。
public class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
helper(root, res, 0);
return res;
}
private void helper(TreeNode root, List<Integer> res, int d){
if(root == null){
return;
}
//expand list size
if(d == res.size()){
res.add(root.val);
}
else{
//or set value
res.set(d, Math.max(res.get(d), root.val));
}
helper(root.left, res, d+1);
helper(root.right, res, d+1);
}
}