当前位置: 首页 > 后端技术 > Java

求二叉树1最宽层有多少个节点

时间:2023-04-01 23:24:00 Java

思路:在逐层遍历的基础上改写。(1)准备四个变量:currentLevelEnd(表示当前层的结束节点)、nextLevelEnd(表示下一层的结束节点)、currentWeight(表示当前层的宽度)、maxWeight(表示最大宽度).(2)将currentLevelEnd改为二叉树的头节点(其他为默认值),将头节点放入队列。(3)从队列中弹出一个节点,每出队一个节点currentWeight加1。如果出队节点有左孩子,则左孩子入队,如果有右孩子,则右孩子入队。如果有节点入队,则nextLevelEnd变为Thecurrentlyenqueuednode(为下一层查找做准备)。(4)判断步骤3中出队的节点是否等于currentLevelEnd。如果是,修改maxWeight为当前最大宽度,重置currentWeight,修改currentLevelEnd为nextLevelEnd,重置nextLevelEnd;如果不是,继续第3步。(5)执行第3步和第4步,直到队列为空。/***@authorJava与算法学习:周一*/publicstaticinttreeMaxWidth(Nodehead){if(head==null){return0;}队列<节点>队列=newLinkedList<>();节点currentLevelEnd=head;节点nextLevelEnd=null;int当前宽度=0;int最大宽度=0;queue.offer(头);while(!queue.isEmpty()){Nodecurrent=queue.poll();当弹出一个节点时,当前层的宽度增加一个currentWidth++;//当有子节点入队时,修改下一层的结束节点if(current.left!=null){queue.offer(current.left);nextLevelEnd=current.left;}}if(current.right!=null){queue.offer(current.right);nextLevelEnd=current.right;=currentLevelEnd){当前宽度LevelEnd=nextLevelEnd;//重置下一层的结束节点nextLevelEnd=null;}}}返回最大宽度;staticinttreeMaxWidth1(Nodehead){if(head==null){返回0;}队列<节点>队列=newLinkedList<>();queue.add(头);//key:node,value:节点在哪一层HashMaplevelMap=newHashMap<>(16);levelMap.put(head,1);//当前是哪个级别intcurLevel=1;//当前层的宽度intcurLevelWidth=0;//最大宽度intmax=0;while(!queue.isEmpty()){Nodecur=queue.poll();intcurNodeLevel=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.add+1);当前权利);}}//当前节点还在当前层级if(curNodeLevel==Curlevel){Curlevelwidth++;}else{//当前层已经遍历。一层已经有节点了,宽度自然是1curLevelWidth=1;}}}//最后一层的宽度没有和max比较,所以需要再比较一次max=Math.max(max,curLevelWidth);返回最大值;}本文所有代码:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/TreeMaxWidth.java