初始化节点
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
1.使用容器
public static int maxWidthUseMap(Node head) {
if(head == null){
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
// level endNode
Map<Integer, Node> map = new HashMap<>(16);
int curLevel = 1;
int size = 0;
int maxSize = 0;
map.put(curLevel,head);
while (!queue.isEmpty()){
head = queue.poll();
size++;
if(head.left != null ){
queue.add(head.left);
map.put(curLevel + 1 ,head.left);
}
if(head.right != null ){
queue.add(head.right);
map.put(curLevel + 1 ,head.right);
}
if(head == map.get(curLevel)){
maxSize = Math.max(size,maxSize);
size = 0;
curLevel++;
}
}
return maxSize;
}
2.不使用容器
public static int maxWidthNoMap(Node head) {
if(head == null){
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
// record tree level end node
Node curEnd = head;
Node nextEnd = null;
int maxWidth = 0;
int size = 0;
while (!queue.isEmpty()){
head = queue.poll();
size++;
if(head.left != null){
queue.add(head.left);
//update next level end
nextEnd = head.left;
}
if(head.right != null){
queue.add(head.right);
//update next level end
nextEnd = head.right;
}
// is current level end ,require max and reset size and curEnd = nextEnd
if(head == curEnd){
maxWidth = Math.max(size,maxWidth);
size = 0;
curEnd = nextEnd;
}
}
return maxWidth;
}