左神–数据结构–二叉树
刷题主要在力扣上进行,穿插着看左神的课。(java语言)
二叉树的最大宽度
即:找到二叉树节点数最多的那层,并返回最大节点数
使用哈希表解决
public int max_kuandu (TreeNode head) {
if(head==null){
return 0;
}
Queue<TreeNode> queue = new LinkedList();
queue.add(head);
Map<TreeNode,Integer> levelMap = new HashMap<>();
levelMap.put(head,1);
int curLevel =1;
int curLecelNodes = 0;
int max = Integer.MIN_VALUE;
while (!queue.isEmpty()){
TreeNode cur = queue.poll();
int curNodeLevel = levelMap.get(cur);
if (curNodeLevel == curLevel){
curLecelNodes++;
}else{
max = Math.max(max,curLecelNodes); // max存储最大节点数目值
curLevel++;
curLecelNodes=1;
}
if(cur.left!=null){
levelMap.put(cur.left,curLevel+1);
queue.add(cur.left);
}
if (cur.right!=null){
levelMap.put(cur.right,curLevel+1);
queue.add(cur.right);
}
}
return max;
}
用哈希表存储当前节点及其所在的层。
curLevel :当前层
curLevelNodes :当前层节点数
curNodeLevel :当前节点所在层
看着挺不好理解的,建议画个二叉树,然后画图走一边,可以很快理解。
使用队列解决
使用队列,采用两个节点来记录当前层的最后一个节点和下一层的最后一个节点。
下一层的最后一个节点由当前层最后压入的子节点来确定
当前层的最后一个节点:当当前层遍历完后,将下一层的最后一个节点赋值给当前层。
public int max_treeNode(TreeNode head){
if(head==null){
return 0;
}
Queue<TreeNode> queue1 = new java.util.LinkedList();
// 声明:当前层的最后一个节点
TreeNode curNode = head;
// 下一层的最后一个节点
TreeNode nextNode = null;
// 当前层的节点数目
int curLevelNodes =0;
// 最大值
int max = Integer.MIN_VALUE;
// 头节点入队
queue1.add(head);
while (!queue1.isEmpty()){
TreeNode cur = queue1.poll();
// 永远是最后一个入队的节点为nextend节点
if(cur.left!=null){
queue1.add(cur.left);
nextNode = cur.left;
}
if(cur.right!=null){
queue1.add(cur.right);
nextNode = cur.right;
}
// 判断当前弹出的节点是否为本层的最后一个节点
if(cur != curNode){
// 否,则本层节点数目++
curLevelNodes++;
}else{
// 是,就更新max,更新当前层的最后一个节点
curLevelNodes++; // 此处++是因为,弹出的当前层的最后一个节点也在本层中,因此数目++
max = Math.max(max,curLevelNodes);
curNode = nextNode; //下一层的最后一个节点赋值给当前层的最后一个节点
nextNode = null;
curLevelNodes = 0; // 本层遍历结束,将节点数目置为0
}
}
return max;
}
注意 :使用队列的代码是根据思路自己手写的,没有使用测试器跑,故不排除会出现错的可能。但本人认为正确的概率会更大!
下次碰到相关题目的时候,要拿过去跑一下!