求一棵树的最大宽度

63 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

思路

这个可以利用二叉树层序遍历的思想来解这个题目。

实现二叉树的按层序遍历 - 掘金 (juejin.cn)

这个是我之前写过的文章,希望可以给你带来一点思路。

我们先要创建一个队列来保存节点。

那我们怎么知道最大值呢?

我们可以先创建一个变量(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还有下一层的元素个数