给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例2:
输入: root = [1,2,3]
输出: [1,3]
提示:
二叉树的节点个数的范围是 [0,104]
-231 <= Node.val <= 231 - 1
Solution1( 逐一BFS ):
这里我们在进行逐一BFS
时是如何辨别该元素是哪一层的呢?
我们使用自定义类State来实现,即可维护每一个节点元素的深度。
Code1:
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
// 逐一BFS
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> res = bfs(root);
return res;
}
public List<Integer> bfs(TreeNode root){
Queue<State> queue = new LinkedList<State>();
if(root == null){
return new ArrayList<Integer>();
}
State start = new State(root,0);
queue.offer(start);
List<Integer> list = new ArrayList<>();
State max_thisDepth = new State(new TreeNode(Integer.MIN_VALUE,null,null),0);
while(queue.size()!=0){
TreeNode temp = queue.peek().node;
int now_depth = queue.peek().depth;
if(temp.left != null){
queue.offer(new State(temp.left,now_depth + 1));
}
if(temp.right != null){
queue.offer(new State(temp.right,now_depth + 1));
}
State thisState = queue.poll();
TreeNode thisNode = thisState.node;
if(max_thisDepth.depth == thisState.depth){
max_thisDepth.node.val = Math.max(max_thisDepth.node.val,thisNode.val);
}
else{
list.add(max_thisDepth.node.val);
max_thisDepth.node.val = thisNode.val;
max_thisDepth.depth = thisState.depth;
}
}
list.add(max_thisDepth.node.val);
return list;
}
}
class State{
TreeNode node;
int depth;
public State(TreeNode node,int depth){
this.node = node;
this.depth = depth;
}
}
Solution2( DFS ):
哈希表
进行记录每一层的最大值
即可,这样在遍历二叉树的时候我们只要根据此时遍历节点的深度
对哈希表进行实时更新即可。Code2:
class Solution {
Map<Integer,Integer> map = new HashMap<>();
public List<Integer> largestValues(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
dfs(root,0);
List<Integer> res = new ArrayList<>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
res.add(entry.getValue());
}
return res;
}
public void dfs(TreeNode root,int depth){
if(map.containsKey(depth)){
int value = map.get(depth);
if(root.val > value){
map.put(depth,root.val);
}
}
else{
map.put(depth,root.val);
}
if(root.left!=null){
dfs(root.left,depth+1);
}
if(root.right!=null){
dfs(root.right,depth+1);
}
return;
}
}
Solution3( 按层BFS ):
一层一层
来进行遍历,即每次我们先从队列中取出该层的所有元素
,再对其进行一个遍历即可,由于我们每次取出的都是同一层
的元素,因此是不需要考虑深度问题,因此可以化繁为简;在实现方面,我们只需要遍历时根据初始队列的长度len,从队列中取出前len个元素
,即可达到取出该层的所有元素,且在取出元素的同时我们也不要忘记将取出的元素的左右非空元素再放入队列即可,这样即可达到每次队列内的元素都是同一层的元素,因此这样可以起到按层来进行搜索的效果。
Code3:
class Solution {
public List<Integer> largestValues(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
List<Integer> res = new ArrayList<>();
while(!queue.isEmpty()){
int this_depth_len = queue.size();
int max = Integer.MIN_VALUE;
while(this_depth_len != 0){ //把该层都取出
TreeNode temp = queue.poll();
max = Math.max(temp.val,max);
if(temp.left != null)
queue.offer(temp.left);
if(temp.right != null)
queue.offer(temp.right);
this_depth_len--;
}
res.add(max);
}
return res;
}
}