思路
- 准备curEnd(表示当前层的结束节点)、nextEnd(表示下一层的结束节点)、curLevelNodes(表示当前层的宽度)、max(表示最大宽度)四个变量。
- curEnd修改为二叉树的头节点(其他均为默认值),头节点入队列。
- 从队列中弹出一个节点,每出队一个节点则curLevelNodes加一,出队节点有左孩子则左孩子入队,有右孩子则右孩子入队,有节点入队则将nextEnd修改为当前入队的节点(为下一层查找做准备,就是找下层最右节点,作为一个标识)。
- 判断第3步出队的节点是否等于curEnd。
- 是,则修改maxWeight为当前最大宽度,currentWeight重置,currentLevelEnd修改为nextLevelEnd,nextLevelEnd重置;
- 否,则继续执行第3步。
- 一直执行第3、4步,直到队列为空。
代码实现
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
public class Code05_TreeMaxWidth {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
public static int maxWidthNoMap(Node head) {
if (head == null) return 0;
Queue<Node> queue = new LinkedList<>();
queue.add(head);
Node curEnd = head;
Node nextEnd = null;
int max = 0;
int curLevelNoes = 0;
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;
}
curLevelNoes++;
if (cur == curEnd) {
max = Math.max(max, curLevelNoes);
curLevelNoes = 0;
curEnd = nextEnd;
}
}
return max;
}
public static void main(String[] args) {
int maxLevel = 10;
int maxValue = 100;
int testTimes = 1000000;
for (int i = 0; i < testTimes; i++) {
Node head = generateRandomBST(maxLevel, maxValue);
if (maxWidthUseMap(head) != maxWidthNoMap(head)) {
System.out.println("Oops!");
}
}
System.out.println("finish!");
}
public static Node generateRandomBST(int maxLevel, int maxValue) {
return generate(1, maxLevel, maxValue);
}
public static Node generate(int level, int maxLevel, int maxValue) {
if (level > maxLevel || Math.random() < 0.5) {
return null;
}
Node head = new Node((int) (Math.random() * maxValue));
head.left = generate(level + 1, maxLevel, maxValue);
head.right = generate(level + 1, maxLevel, maxValue);
return head;
}
public static int maxWidthUseMap(Node head) {
if (head == null) {
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
HashMap<Node, Integer> levelMap = new HashMap<>();
levelMap.put(head, 1);
int curLevel = 1;
int curLevelNodes = 0;
int max = 0;
while (!queue.isEmpty()) {
Node cur = queue.poll();
int curNodeLevel = levelMap.get(cur);
if (cur.left != null) {
levelMap.put(cur.left, curNodeLevel + 1);
queue.add(cur.left);
}
if (cur.right != null) {
levelMap.put(cur.right, curNodeLevel + 1);
queue.add(cur.right);
}
if (curNodeLevel == curLevel) {
curLevelNodes++;
} else {
max = Math.max(max, curLevelNodes);
curLevel++;
curLevelNodes = 1;
}
}
max = Math.max(max, curLevelNodes);
return max;
}
}