首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

微信的DeepSeek 也崩了....

微信在搜索功能里接入了 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)。

为什么要用队列?

很多人可能会觉得,二叉树不就是树形结构吗?为什么要引入队列呢?其实这里的队列非常重要,它帮助我们按层级顺序处理每一层的节点,保证了从左到右的遍历顺序。而且通过队列,我们可以轻松实现 层序遍历,从而计算每一层的节点数。

总结

二叉树的最大宽度问题是经典的层序遍历应用,关键在于理解如何高效地计算每一层的宽度并更新最大值。

通过队列的辅助,我们能够轻松地遍历每一层,计算出最大宽度。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OssWBu7u1nif023P_0lDAg5Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券