102. 二叉树的层序遍历
层遍历:
当前节点入队,弹出并打印,左右子节点入队
public static void leveOrder(TreeNode head){ if(head==null){ return; } Queue<TreeNode> queue=new LinkedList<>(); queue.add(head); while (!queue.isEmpty()){ TreeNode cur=queue.poll(); System.out.println(cur.val); if(head.left!=null){ queue.add(head.left); } if(head.right!=null){ queue.add(head.right); } } }
统计最多的节点数
用HashMap来记录当前节点的在哪一层
public static int leveOrderCount(TreeNode head){ if(head==null){ return 0; } Queue<TreeNode> queue=new LinkedList<>(); queue.add(head); //这个节点在哪一层 HashMap<TreeNode,Integer> leveMap=new HashMap<>(); leveMap.put(head,1); int level=1; int curNodes=0; int maxNodes=0; List<Integer> list=new ArrayList<>(); while (!queue.isEmpty()){ TreeNode cur=queue.poll(); Integer curlevel = leveMap.get(cur); if(level==curlevel){ curNodes++; list.add(cur.val); }else{ //来到了下一层 //统计最大了节点数 maxNodes= Math.max(curNodes, maxNodes); level++; curNodes=1; } System.out.println(cur.val); if(cur.left!=null){ leveMap.put(cur.left,curlevel+1); queue.add(cur.left); } if(cur.right!=null){ leveMap.put(cur.right,curlevel+1); queue.add(cur.right); } } return Math.max(maxNodes,curNodes); }
102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:用HashMap来记录当前节点的在哪一层
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> resultList=new ArrayList<>(); if(root==null){ return resultList; } List<Integer> curLevelList=new ArrayList<>(); HashMap<TreeNode,Integer> levelMap=new HashMap<>(); levelMap.put(root,1); int level=1; Queue<TreeNode> queue=new LinkedList<>(); queue.add(root) while(!queue.isEmpty()){ TreeNode curNode=queue.poll(); int curLevel=levelMap.get(curNode); if(level==curLevel){ curLevelList.add(curNode.val); }else{ resultList.add(curLevelList); level++; curLevelList=new ArrayList<>(); curLevelList.add(curNode.val); } if(curNode.left!=null){ levelMap.put(curNode.left,curLevel+1); queue.add(curNode.left); } if(curNode.right!=null){ levelMap.put(curNode.right,curLevel+1); queue.add(curNode.right); } } resultList.add(curLevelList); return resultList; } }
剑指 Offer II 044. 二叉树每层的最大值
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
解释:
1
/ \
3 2
/ \ \
5 3 9
public List<Integer> largestValues(TreeNode root) { List<Integer> res=new ArrayList<>(); if(root==null){ return res; } //level quque linkedList cur l f TreeNode cur=root; LinkedList<TreeNode> queue=new LinkedList<>(); queue.add(cur); Map<TreeNode,Integer> levelMap=new HashMap<>(); levelMap.put(cur,1); int max=Integer.MIN_VALUE; int curLevel=1; while(!queue.isEmpty()){ cur=queue.poll(); //System.out.println(cur.val); Integer level = levelMap.get(cur); if(curLevel==level){ max=Math.max(max,cur.val); }else{ res.add(max); curLevel++; max=cur.val; } // System.out.println(max); if(cur.left!=null){ levelMap.put(cur.left,level+1); queue.add(cur.left); } if(cur.right!=null){ levelMap.put(cur.right,level+1); queue.add(cur.right); } } max=Math.max(max,cur.val); // System.out.println(max); res.add(max); return res; }