二叉树的宽度是指各层结点数的最大值,下图中第一层结点数为 1,第二层为 2,第三层为 3,第四层为 2,所以二叉树的宽度为 3。
代码思路
1需要创建的属性有 :1.队列来存储节点2. 当前层最右节点 3下一层最右节点4.当前层的节点数
2.先把头节点放入队列里面 然后进入循环后 弹出一个 分别判断是否有左孩子和右孩子 如果有把对应的孩子加入队列 并把下一层最右节点数设置成当前孩纸
3.弹出一个队列元素之后 记当前层的节点数加一
4.若弹出的队列元素是当层最右层的节点代表这一层结束则需要进行1.比较max和当层节点数把当层节点数设置成0 以便于下一层继续计数 3.把当前的最右节点设置成下一层的最右节点
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 curLevelNodes = 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;
}
curLevelNodes++;
if (cur == curEnd) {
max = Math.max(max, curLevelNodes);
curLevelNodes = 0;
curEnd = nextEnd;
}
}
return max;
}
哈希表法
public static int maxWidthUseMap(Node head) {
if (head == null) {
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
// key 在 哪一层,value
HashMap<Node, Integer> levelMap = new HashMap<>();
levelMap.put(head, 1);
int curLevel = 1; // 当前你正在统计哪一层的宽度
int curLevelNodes = 0; // 当前层curLevel层,宽度目前是多少
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;
}