clllll  

二叉树深度优先遍历就是 先序遍历

二叉树宽度优先遍历,

用队列,先进先出,先放左,再放右

public static void widthOrder(Node head) {
if (head == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
Node cur = null;
while (!queue.isEmpty()) {
cur = queue.poll();
System.out.print(cur.value + " ");
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
}
}

二叉树最大宽度

  • 当前遍历到第几层,
  • 当前层有多少个node
public static int getMaxWidth(Node head) {
if (head == null) {
return 0;
}
Node cur = null;
Node left = null;
Node right = null;
Integer curLevel = 0;
Integer maxWidth = -1;
Integer curWidth = 1;
Integer nodeLevel = null;
// 队列,先进先出
LinkedList<Node> queue = new LinkedList<>();
queue.add(head); // 根节点 入队
// 准备haspMap key是node, value是当前是node的层数
HashMap<Node, Integer> levelMap = new HashMap<>();
levelMap.put(head, 1); // 根节点 1层
while (!queue.isEmpty()) {
cur = queue.poll(); // 出队
left = cur.left;
right = cur.right;
nodeLevel = levelMap.get(cur); // 获取当前Node 层数
if (left != null) {
// 左node 入队
queue.add(left);
// 左node 层数 + 1 存入 map
levelMap.put(left, nodeLevel + 1);
}
if (right != null) {
// 右node 入队
queue.add(right);
// 右node 层数 + 1 存入map
levelMap.put(right, nodeLevel + 1);
}
if (levelMap.get(cur) > curLevel) {
//因为是按层遍历的,如果层变了,说明肯定到下一层了。,可以更新参数了
// 当前node的层数大于 当前层,
curWidth = 1; // 更新 curWidth
curLevel = levelMap.get(cur); // 更新curLevel
} else {
// 当前node还是属于同一层
curWidth++;
}
// 更新 maxWidth
maxWidth = Math.max(maxWidth, curWidth);
}
return maxWidth;
}

不使用hashMap 的方法

变量:

  • max
  • 当前层最后一个节点 初始根节点
  • 下一层最后一个节点 节点进队 就更新 为当前进队的节点
  • 当前层发现的node数
  • 当前level
posted on   llcl  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
 
点击右上角即可分享
微信分享提示