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数据结构与算法之求树的最大宽度的主要内容,如果未能解决你的问题,请参考以下文章