求二叉树的最大宽度首先沿用了二叉树的按层遍历的方式,在遍历的时候添加几个属性标识运行中的状态;
- max :标识二叉树的最大宽度
- curLevelNodes:当前层的节点数,要和max进行比较,取大值赋给max
- curEnd :当前层的结束节点,
- nextEnd :下一层的结束节点
思路
- 1.按照按层遍历的思想,创建一个Queue队列,先把头结点head放进去,因为头结点算第一层,这层的结束节点是自身,所以curEnd = head,
- while循环弹出队列中的数据,弹出时判断有没有左右节点有的话,就把左右节点放进队列,并且更新下一层的结束节点的值,先加左,再加右,这样当这一层遍历结束了,下一层的结束节点也就确定了。
- 每弹出一个节点,当前层的节点数要++,也就是curLevelNodes++,以记录当前层的节点数
- 如果当前遍历的节点是当前层的结束节点,证明这层遍历结束了,此时要把这层的节点数和max比大小,大值赋给max,并且下层的结束节点要赋给当前层的结束节点curEnd=nextEnd;,下层的结束节点要置空nextEnd=null,当前层的节点数要归0,这是因为要进行下层的遍历了
- 最后返回max,就是二叉树的最大宽度
static class Node{
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
}
public static int maxWidth(Node head){
if(head==null)return 0;
int max = 0;//最大节点数
int curLevelNodes=0;//当前层的节点数
Node curEnd = head;//当前层的结束节点
Node nextEnd = null;//下一层的结束节点,当前层就把下一层的范围确定下来
Queue<Node> queue = new LinkedList<>();
queue.add(head);
while (!queue.isEmpty()){
Node cur = queue.poll();
if(cur.left!=null){
queue.add(cur.left);
nextEnd=cur.left;
}
if(cur.right!=null){
queue.add(cur.right);
nextEnd=cur.right;
}
curLevelNodes++;
if(cur==curEnd){
//当前层的节点数和max比大小,大值赋给max
max=Math.max(max,curLevelNodes);
//下层结束节点赋给当前层结束节点
curEnd=nextEnd;
//当前层节点数归0
curLevelNodes=0;
//下层结束节点置空
nextEnd=null;
}
}
return max;
}