求二叉树最大宽度
Posted laydown
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求二叉树最大宽度相关的知识,希望对你有一定的参考价值。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
/**
* 二叉树最大宽度
*/
public class TreeMaxWidth {
/**
* 不使用HashMap实现
*
* @param head 二叉树的头节点
* @return 最大宽度
*/
public int treeMaxWidthNoMap(Node head) {
int maxWidth = 0;
if (head == null) {
return maxWidth;
}
// 用队列实现
Queue<Node> queue = new LinkedList<>();
queue.add(head);
Node curEnd = head;
Node nextEnd = null;
int curWidth = 0;
while (!queue.isEmpty()) {
Node node = queue.poll();
if (node.left != null) {
queue.add(node.left);
nextEnd = node.left;
}
if (node.right != null) {
queue.add(node.right);
nextEnd = node.left;
}
curWidth++;
if (node == curEnd) {
maxWidth = Math.max(maxWidth, curWidth);
curWidth = 0;
curEnd = nextEnd;
}
}
return maxWidth;
}
/**
* 使用HashMap实现
*
* @param head 二叉树的头节点
* @return 最大宽度
*/
public int treeMaxWidthUseMap(Node head) {
int maxWidth = 0;
if (head == null) {
return maxWidth;
}
// 用队列实现
Queue<Node> queue = new LinkedList<>();
queue.add(head);
// 节点对应在哪一层
HashMap<Node, Integer> levelMap = new HashMap<>();
levelMap.put(head, 1);
int curWidth = 0;
int level = 1;
while (!queue.isEmpty()) {
Node node = queue.poll();
int curLevel = levelMap.get(node);
if (node.left != null) {
queue.add(node.left);
levelMap.put(node.left, levelMap.get(node) + 1);
}
if (node.right != null) {
queue.add(node.right);
levelMap.put(node.right, levelMap.get(node) + 1);
}
if (curLevel == level) {
curWidth++;
} else {
maxWidth = Math.max(maxWidth, curWidth);
level = curLevel;
curWidth = 1;
}
}
maxWidth = Math.max(maxWidth, curWidth);
return maxWidth;
}
/**
* 二叉树结构
*/
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
}
/* 如有意见或建议,欢迎评论区留言;如发现代码有误,欢迎批评指正 */
以上是关于求二叉树最大宽度的主要内容,如果未能解决你的问题,请参考以下文章