本文已参与「新人创作礼」活动,一起开启掘金创作之路。
思路
这个可以利用二叉树层序遍历的思想来解这个题目。
这个是我之前写过的文章,希望可以给你带来一点思路。
我们先要创建一个队列来保存节点。
那我们怎么知道最大值呢?
我们可以先创建一个变量(num),这个变量就是来记录当前层有多少的元素。然后再创建一个变量(max)这个变量就是来记录最大的宽度。
那我们怎么知道这一层怎么结束了呢?
那我们在每次元素弹出的时候num--,如果num == 0,那么就代表这一层就没有元素了,下一层的元素就是队列的大小。然后也要更新最大值。
代码
节点类
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
最大宽度求解
public static int maxWidth(Node head) {
if (head == null) {
return 0;
}
//注意点1
Queue<Node> queue = new LinkedList<>();
queue.add(head);
//注意点2
int max = 1;
int curWidth = 1;
//注意点3
while(!queue.isEmpty()){
Node cur = queue.poll();
curWidth--;
if(cur.left != null){
queue.add(cur.left);
}
if(cur.right != null){
queue.add(cur.right);
}
//注意点4
if(curWidth == 0){
curWidth = queue.size();
max = Math.max(curWidth, max);
}
}
return max;
}
注意点1:
这个注意点就是队列的Queue是个接口不能实例化实体,需要别的来帮忙
注意点2:
这个注意点就是这两个变量的意义,一个是来记录最大值的,一个是来记录当前层有多少变量的,
同时一层的结束也是这个变量来表示的。
注意点3:
这个就是循环的结束条件,是在队列里面没有元素的时候结束循环
注意点4:
这个注意点就是判断一个层有没有结束,如果结束了,那么就要更新max还有下一层的元素个数