微信在搜索功能里接入了 DeepSeek-R1 模型,开启了灰度测试,幸运地被我抽中体验了一把。
打开微信搜索框,赫然看到“AI搜索”字样,不过,老实说,有点“卡”。在高峰期的时候,根本就无法响应,最后出来的还是“服务繁忙”提醒,真是让人有点焦虑。
我在 iPhone 上试了几次,每次都是慢吞吞的,回复很慢,有时候还完全没反应。
微信的官方回应说,这个功能还在小范围测试阶段,后续会继续优化。
优化是个需要时间的过程,只希望下一次测试时能体验得更好,别再让我“卡死”在服务器繁忙的提示中。
话说,你们都灰度到了吗?(备注:文末可领最新资料)。
算法题:二叉树最大宽度
今天我们来聊聊一道经典的算法题:二叉树的最大宽度。
作为程序员,我们总是需要面对各种各样的算法题,二叉树这种数据结构就是我们经常会遇到的一类。二叉树结构简单,但却包含了很多有意思的挑战,最大宽度问题就是其中一个。
题目解析
所谓二叉树的最大宽度,指的是在树的某一层中,节点数目最多的那一层的节点数。这里有个细节,"宽度"是指这一层中,节点的数量,而不管这些节点的值是什么。
举个例子吧,给你一个简单的二叉树:
1
/ \
2 3
/ \ \
4 5 6
对于这棵树,最大宽度发生在第二层,也就是节点 2 和 3 之间。你看这层的节点数是2,而其他层的宽度要么是1,要么是0。那这棵树的最大宽度就是2了。
思路分析
对于这道题,首先我们需要明确一点——二叉树的最大宽度并不是遍历所有节点求宽度这么简单。如果我们每次都遍历一层的所有节点,虽然能得到宽度,但效率肯定会有问题。为了提高效率,我们需要采用 层序遍历 来解决这个问题。
在层序遍历中,我们可以借助队列来帮助实现。我们每次将当前层的节点依次入队,保证从左到右遍历。这里有个小技巧,为了计算每一层的宽度,我们需要存储节点的“位置”,即节点在层级中的索引。
举个例子:假设当前层的节点从左到右的索引分别是0, 1, 2, 3,那么下一层的节点在队列中的索引应该是上一层节点索引的倍数(比如,左子节点是2 * 当前节点索引,右子节点是2 * 当前节点索引 + 1)。
代码实现
我们通过层序遍历来计算二叉树的最大宽度,具体代码如下:
import java.util.*;
public class Solution {
public int widthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
int maxWidth = 0;
Queue<TreeNode> queue = new LinkedList<>();
// 将节点和它的索引一起放入队列
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
int first = 0, last = 0;
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
// 获取当前节点在该层的索引
int index = node.val;
if (i == 0) first = index; // 第一个节点
if (i == size - 1) last = index; // 最后一个节点
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
// 更新最大宽度
maxWidth = Math.max(maxWidth, last - first + 1);
}
return maxWidth;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
代码讲解
队列的使用:我们用 Queue<TreeNode> 来做层序遍历,每次从队列中弹出一个节点,并且将其左右子节点入队。
节点索引:每个节点有一个索引,first 保存当前层最左边的节点的索引,last 保存当前层最右边节点的索引。每一层的最大宽度就等于 last - first + 1。
更新最大宽度:在每一层遍历结束后,我们比较当前层的宽度和之前的最大宽度,来更新 maxWidth。
时间复杂度和空间复杂度
时间复杂度:这个算法需要遍历所有节点,每个节点只会入队和出队一次,所以时间复杂度是 O(N),其中 N 是二叉树中节点的总数。
空间复杂度:队列中最多存储的是树的最大宽度的节点数,在最坏情况下(完全二叉树)队列的最大长度是 O(N),所以空间复杂度是 O(N)。
为什么要用队列?
很多人可能会觉得,二叉树不就是树形结构吗?为什么要引入队列呢?其实这里的队列非常重要,它帮助我们按层级顺序处理每一层的节点,保证了从左到右的遍历顺序。而且通过队列,我们可以轻松实现 层序遍历,从而计算每一层的节点数。
总结
二叉树的最大宽度问题是经典的层序遍历应用,关键在于理解如何高效地计算每一层的宽度并更新最大值。
通过队列的辅助,我们能够轻松地遍历每一层,计算出最大宽度。
领取专属 10元无门槛券
私享最新 技术干货