二叉树的最大宽度

该文章介绍了一种计算二叉树最大宽度的方法,通过按层遍历二叉树,维护当前层的节点数、最大宽度以及相邻层的结束节点。在遍历过程中,使用队列存储节点,不断更新最大宽度和层级信息。当遍历到当前层的结束节点时,比较当前层的节点数与最大宽度,并更新最大值。最后返回最大宽度作为结果。
摘要由CSDN通过智能技术生成

  求二叉树的最大宽度首先沿用了二叉树的按层遍历的方式,在遍历的时候添加几个属性标识运行中的状态;

  • 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;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值