java数据结构与算法之求树的最大宽度

Posted wen-pan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构与算法之求树的最大宽度相关的知识,希望对你有一定的参考价值。

一、分析

  • 要求一棵树的最大宽度,则我们需要知道每一层的最大宽度,然后才能找出最宽的那一层。
  • 由于需要知道每一层的宽度(该层的节点个数),所以需要一层一层的遍历二叉树,所以这正好符合树的宽度优先遍历。
  • 要知道每一层的宽度,其实就是统计每一层的节点个数。所以在遍历每一层的时候,需要知道当前节点所处的是哪一层,并且将该层的节点个数加一。
  • 当每一层遍历完后,需要将该层的节点个数与先前的层的节点个数最多的层做比较,取最大的那个值作为max。
  • 逐一遍历完每一层后,返回max即是最大值。

二、代码实现

/**
 * @param head
 * @description: 计算一棵二叉树的最大宽度,仍然以宽度优先来遍历树
 * 具体流程:
 * 按照广度优先来遍历二叉树,并且需要知道当前遍历的节点在树的第几层,所以我们这里使用map来存放每个节点在第几层
 * 用一个变量currentLevel来记录当前遍历到二叉树的第几层了,用一个变量 currentLevelNodes 来记录当前层的总共节点数
 * 如果当前节点所在的层和 currentLevel在同一层,则将 currentLevelNodes 加一.
 * 如果当前节点所在的层和 currentLevel不在同一层,则说明该节点已经跨到新的一层了,需要将 currentLevelNodes 置为1并且
 * 将 currentLevel 指向下一层,并且比较上一层的节点数和最大节点数谁最大,谁最大谁就赋值给max
 * @return: int
 */
public static int calculateMaxWidth(final TreeNode head) {
    if (head == null) {
        return 0;
    }
    // 记录各个节点在第几层
    final HashMap<TreeNode, Integer> map = new HashMap<>();
    // 队列,按广度优先来遍历树需要使用到队列辅助
    final LinkedList<TreeNode> queue = new LinkedList<>();
    // 当前在树的哪一层
    int currentLevel = 1;
    // 当前层的节点数
    int currentLevelNodes = 0;
    // 二叉树的最大宽度,初始默认为最小
    int max = Integer.MIN_VALUE;
    queue.add(head);
    map.put(head, currentLevel);

    while (!queue.isEmpty()) {
        // 从队列里拿出一个元素,如果该元素所处的层和 currentLevel 相同,则将currentLevelNodes + 1
        final TreeNode node = queue.poll();
        if (currentLevel == map.get(node)) {
            currentLevelNodes++;
        } else {
            // 如果节点所处的层不是 currentLevel 层,则说明该节点换层了,此时统计 currentLevel 层元素个数
            // 然后比较当前层元素个数和max的值谁大,谁大谁就是max
            max = Math.max(max, currentLevelNodes);
            // 将当前层的个数置为1,当前层+1
            currentLevel = currentLevel + 1;
            currentLevelNodes = 1;
        }
        // 将左右孩子都入队,并且放入到map中,map中记录了各个节点在第几层
        if (node.left != null) {
            map.put(node.left, currentLevel + 1);
            queue.add(node.left);
        }
        if (node.right != null) {
            map.put(node.left, currentLevel + 1);
            queue.add(node.right);
        }
    }

    return max;
}

以上是关于java数据结构与算法之求树的最大宽度的主要内容,如果未能解决你的问题,请参考以下文章

java数据结构与算法之二叉树的最大宽度和最大深度问题

java数据结构与算法之二叉树的最大宽度和最大深度问题

java数据结构与算法之求所有子数组问题

java数据结构与算法之求所有子数组问题

java数据结构与算法之求所有子数组问题

动画:面试算法之求二叉树的下一节点