当前位置: 首页 > wzjs >正文

佛山禅城区网站建设公司seo网站建设

佛山禅城区网站建设公司,seo网站建设,网络销售模式 自建网站,网站备案审核通过时间文章目录 摘要描述题解答案题解代码分析代码关键点解释: 示例测试及结果解释一下输出: 时间复杂度空间复杂度总结 摘要 在日常项目中,处理「树状结构」并不是稀罕事,比如做组织架构图、文件夹视图或者评论嵌套列表,我…

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码关键点解释:
    • 示例测试及结果
      • 解释一下输出:
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常项目中,处理「树状结构」并不是稀罕事,比如做组织架构图、文件夹视图或者评论嵌套列表,我们经常会遇到对树的各种“奇怪”遍历方式。今天这题 LeetCode 314 —— Binary Tree Vertical Order Traversal(二叉树的垂直遍历),就考验了我们如何按垂直方向组织二叉树节点。

用 Swift 来解这题,既锻炼 BFS 的功底,也让我们更清晰地思考数据结构在空间维度上的组织方式。

描述

原题是这样说的:

给你一棵二叉树,要求按「垂直顺序」遍历这棵树,也就是从左到右,按每一列收集节点。如果同一列上有多个节点,则按从上到下的顺序排列。

举个例子:

输入:

    3/ \9   8/ \ / \
4  0 1  7

输出:

[[4],[9],[3, 0, 1],[8],[7]
]

我们可以看到,节点是按照“列”的方式被输出的,左边的列(值更小)先输出,垂直方向上再按从上往下排列。

题解答案

要按“列”的方式遍历二叉树,并且保证从上到下的顺序,首选 BFS(广度优先搜索)。因为 DFS 虽然也能遍历整棵树,但不容易保持“从上往下”的顺序。我们可以用一个队列来记录每个节点和它所在的“列索引”,然后逐层展开。

核心逻辑如下:

  1. 给每个节点一个「列号」col,根节点为 0。
  2. 左子节点的 col = 父节点 - 1,右子节点的 col = 父节点 + 1
  3. 用一个字典 colMap 存储每一列的节点。
  4. 记录列的最小值和最大值,方便最后输出排序。

题解代码分析

import Foundationclass TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val = valself.left = nilself.right = nil}
}func verticalOrder(_ root: TreeNode?) -> [[Int]] {guard let root = root else { return [] }var colMap: [Int: [Int]] = [:]     // 存储每列的节点值var queue: [(TreeNode, Int)] = [(root, 0)] // 节点和它对应的列索引var minCol = 0var maxCol = 0while !queue.isEmpty {let (node, col) = queue.removeFirst()colMap[col, default: []].append(node.val)minCol = min(minCol, col)maxCol = max(maxCol, col)if let left = node.left {queue.append((left, col - 1))}if let right = node.right {queue.append((right, col + 1))}}var result: [[Int]] = []for i in minCol...maxCol {result.append(colMap[i] ?? [])}return result
}

代码关键点解释:

  • queue 使用 tuple (TreeNode, Int) 表示每个节点及其对应列。
  • colMap 用字典把列号映射成一个数组,保存每列的值。
  • BFS 确保了“从上到下”的顺序。
  • 最后用 minCol...maxCol 依序提取每列结果,保证左到右。

示例测试及结果

我们写个 Demo 来验证一下这个函数是不是按预期工作:

// 构造树:
//     3
//    / \
//   9   8
//  / \ / \
// 4  0 1  7let root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(8)
root.left?.left = TreeNode(4)
root.left?.right = TreeNode(0)
root.right?.left = TreeNode(1)
root.right?.right = TreeNode(7)let result = verticalOrder(root)
print(result)
// 输出:[[4], [9], [3, 0, 1], [8], [7]]

解释一下输出:

  • 列 -2:只有 4
  • 列 -1:只有 9
  • 列 0:3, 0, 1(从上到下)
  • 列 1:8
  • 列 2:7

顺序和题目要求完全一致

时间复杂度

  • 每个节点只会遍历一次,所以时间复杂度是 O(n),其中 n 是二叉树的节点数量。
  • 字典和队列的操作都是常数时间内完成的。

空间复杂度

  • 队列最多同时保存一层节点,最坏情况下是满二叉树的一层,复杂度是 O(n)
  • 额外的 colMap 字典也要保存所有节点,所以整体空间复杂度也是 O(n)

总结

这题不只是一次 BFS 的考察,更是对“空间索引”的思考方式的一种锻炼:

  • 如果你在做一个需要按“列”展示数据的系统,比如:楼层展示、评论层级分区、地图格子渲染,那这题的建模方式就很有参考意义。
  • Swift 写 BFS 很直观,但队列用数组操作 removeFirst() 时注意性能(如果性能敏感可以用双端队列)。
  • 最终输出要注意列的排序顺序,维护好 minColmaxCol 是一个非常实用的小技巧。
http://www.dtcms.com/wzjs/146007.html

相关文章:

  • wordpress淘宝评论调用插件网站优化名词解释
  • 做电商网站有什么用推广网站都有哪些
  • 景观设计方案网站国内广告投放平台
  • 网站建设公司大概多少钱竞价推广营销
  • 网站建设编辑叫什么岗位bt搜索引擎最好用的
  • go网站做富集分析广州专门做seo的公司
  • 可以做微商的网站百度ocpc如何优化
  • b2c电子商务网站的需求分析不收费的小说网站排名
  • 找网站建设需要问什么软件公司网站建设推广
  • 百度推广与做网站推广的区别站长工具四叶草
  • 网上有什么做任务赚钱的网站金华网站推广
  • 将自己做的网站发布到优化seo方案
  • 做网站的皮包公司免费手机网站建站平台
  • 武汉建站之星信息科技有限公司百度url提交
  • wordpress登陆函数搜素引擎优化
  • 织梦网站内容替换seo优化效果怎么样
  • wordpress网站类型优化清理大师
  • 深圳 福田 网站建设灰色词首页排名接单
  • 购物网站界面设计搜索引擎优化的简写是
  • 网站建设中 请稍后访问链交换反应
  • 中山市 做网站google chrome谷歌浏览器
  • 风景网站的制作郑州网站建设专业乐云seo
  • 百度站长工具登录方式电商平台怎么搭建
  • 汕头网站设计定制重庆seo排名优化费用
  • 商务网站建设的一般流程网络营销公司注册找哪家
  • 查询优惠券的网站如何做互联网销售包括哪些
  • 欧美做同志网站营销培训课程2022
  • 唐山个人网站建设软文撰写
  • 网站后台编辑湖北百度seo排名
  • 房屋租赁网站建设如何给客户定位软文营销经典案例