辛星Java树算法教程第七篇:二叉树的宽度

所谓二叉树的宽度,就是相当于二叉树在分层遍历的时候,每一层都有自己的节点数,然后找出层数最大的那个。
其实这里只需要借助于分层遍历即可,需要注意的是,我们需要知道什么时候开始一个新的层即可,常见的思路有两种,一种是保存每一层最左边的节点,一种是保存每一层的节点个数。
如果是保存每一层的最左边的节点的话,我们只需要在一个循环里面判断即可。
如果是保存每一层的节点个数的话,我们需要两个循环,即外循环是每层一个循环,内循环是每层的节点会进行循环。
我们这里仅给出第一种方式的代码实现,如下所示:

package com.mengzhidu.teach.algorithm.tree.demo.basic;

import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * 求二叉树的每层的最大宽度,这里注意是每一层,而不是求直径
 * 这里需要借助二叉树的分层遍历的实现,逐次比较每层的数据即可
 * 这里比分层遍历稍微复杂一点,它需要确保每一层被访问完之后才能继续
 * 那么如何来标记每层被访问完了呢?常见的有两种方式
 * 第一种是记录下一层最左边的元素,把它保存在临时变量中
 * 第二种是用一个变量记录每层有多少个,然后在操作每一层的时候把这一层的元素弹空
 */
public class WidthDemo {

    public static void main(String[] args) {
        TreeNode root = TreeNodeHelper.getTreeNode();
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        TreeNode left = root.getLeft();
        int maxWidth = 1;
        int width = 0;

        while (!queue.isEmpty()) {
            TreeNode tmp = queue.poll();
            if (tmp == left) {
                maxWidth = width > maxWidth ? width : maxWidth;
                width = 1;
                left = null;
            }
            if (tmp.getLeft() != null) {
                queue.add(tmp.getLeft());
                width ++;
                if (left == null) {
                    left = tmp.getLeft();
                }
            }

            if (tmp.getRight() != null) {
                queue.add(tmp.getRight());
                width ++;
                if (left == null) {
                    left = tmp.getRight();
                }
            }
        }

        System.out.println("最大宽度为:" + maxWidth);
    }
}

对于求二叉树的宽度,我们就介绍到这里啦。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值