一、层序遍历
public List<List<Integer>> levelOrder(TreeNode root) {
//层序遍历 最经典的BFS
List<List<Integer>> res=new LinkedList<>();
if(root==null) return res;
Queue <TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
List<Integer> list=new LinkedList<>();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
list.add(node.val);
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
res.add(list);
}
return res;
}
二、二叉树的最大宽度
leetcode 662 题
层序遍历每一层记录开始坐标和结束坐标之差
public int widthOfBinaryTree(TreeNode root) {
if(root==null) return 0;
Queue <TreeNode> q1=new LinkedList<>();
Queue <Integer> q2=new LinkedList<>();
q1.offer(root);
q2.offer(1);
int res=0;
int pos=0; int start=0;
while(!q1.isEmpty()){
int size=q1.size();
start=q2.peek();
for(int i=0;i<size;i++){
TreeNode node=q1.poll();
pos=q2.poll();
if(node.left!=null) {
q1.offer(node.left);
q2.offer(2*pos);
}
if(node.right!=null){
q1.offer(node.right);
q2.offer(2*pos+1);
}
}
res=Math.max(res,pos-start+1);
}
return res;
}
三、二叉树的右视图
leetcode 199题
利用层序遍历来记录每一层中最后一个值
public List<Integer> rightSideView(TreeNode root) {
List <Integer> list=new LinkedList<>();
if(root==null) return list;
Queue <TreeNode> queue=new LinkedList<>();
queue.offer(root);
int num=0;
while(!queue.isEmpty()){
int size=queue.size();
num=0;
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
num=node.val;
}
list.add(num);
}
return list;
}
四、二叉树每层的最大值
leetcode 515 题
利用层序遍历 来记录每一层中最大的值
public List<Integer> largestValues(TreeNode root) {
List<Integer> list=new LinkedList<>();
if(root==null) return list;
int num=Integer.MIN_VALUE;
Queue <TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
num=Integer.MIN_VALUE;
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
num=Math.max(num,node.val);
}
list.add(num);
}
return list;
}
总结
二叉树类型的习题基本上都是与遍历有关的,就是dfs和bfs相关的,本文介绍了几个常见的bfs 相关做法的题目,套路都是一样的,只要理解一个其他的都就可以学会。