尊享面试100题(314.二叉树的垂直遍历python)

server/2024/10/19 2:14:37/

题目关键词,从左到右,从上到下,那么使用bfs宽度优先算法。

使用字典v保存每一列的值。

python">class Solution:def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []v = defaultdict(list)qu = deque()qu.append([root, 0])while qu:node, column = qu.popleft()v[column].append(node.val)if node.left: qu.append([node.left, column - 1])if node.right: qu.append([node.right, column + 1])return [ v[x] for x in sorted(v.keys())]

刚开始我使用的还是dfs,发现过程确实复杂一些,不能从上到下遍历。这是我原来的代码:

python">class Solution:def __init__(self):self.ans = defaultdict(dict)self.idx = 0def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []self.init_idx(root, 0)self.dfs(root, -self.idx, 0)ans = []k1 = sorted(self.ans.keys())for x in k1:ans.append([])k2 = sorted(self.ans[x].keys())for y in k2:ans[-1] += self.ans[x][y]return ansdef init_idx(self, root, idx):if root.left:self.init_idx(root.left, idx - 1)if root.right:self.init_idx(root.right, idx + 1)self.idx = min(self.idx, idx)def dfs(self, root, idx, idy):if not root: returnif idy not in self.ans[idx]:self.ans[idx][idy] = [root.val]else:self.ans[idx][idy].append(root.val)self.dfs(root.left, idx-1, idy + 1)self.dfs(root.right, idx+1, idy + 1)

 

 回顾一下,发现init_idx这个函数没必要,他目的是,如果中间节点root的列的编号为0,那么最左边节点的列的编号为self.idx,可以推出,如果最左边节点列的编号为0,那么root排在第-self.idx列。

可以省掉这一步,直接设置root节点为第0列,左节点为-1列,右节点为第1列,最后在把列排个序。这样的话,左节点-1直接变道0,root变道1,右节点变道2.


http://www.ppmy.cn/server/38469.html

相关文章

【Vue3源码学习】— CH3.4 baseCreateRenderer 详解

baseCreateRenderer 详解 1. 源码结构分析2. optionsoptions传入说明3. 方法归类4. 关键职责4.1 初始化和环境配置4.2 底层 DOM 操作方法的设置4.3 核心渲染逻辑4.4 生命周期和更新机制4.5 水合功能的支持5. 关键流程解析5.1 方法定义5.2 渲染触发5.3 渲染细节处理6. 总结接下来…

计算机等级考试常见问题

目录 计算机二级报什么好? 计算机等级考试可以直接考4级吗 计算机等级考试包括什么

LeetCode509:斐波那契数(使用动态规划)

题目描述 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1…

PDF转word转ppt软件

下载地址:PDF转word转ppt软件.zip 平时工作生活经常要用到PDF转word转ppt软件,电脑自带的又要开会员啥的很麻烦,现在分享这款软件直接激活就可以免费使用了,超级好用,喜欢的可以下载

C#逻辑运算符

C#中逻辑运算符分为: 或、与、非 或||: 对两个bool值进行逻辑运算 有真则真 同假则假 与&&: 对两个布尔值进行运算 有假则假 同真为真 非&#xff01;: 对两个bool值进行取反 真变假 假变真 或 || 符号 &#xff1a; || <u>*对两个bool值进行逻辑运算 有真则…

五月加仓比特币

作者&#xff1a;Arthur Hayes Co-Founder of 100x. 编译&#xff1a;Liam 编者注&#xff1a;本文略有删减 (以下内容仅代表作者个人观点&#xff0c;不应作为投资决策的依据&#xff0c;也不应被视为参与投资交易的建议或意见&#xff09;。 从四月中旬到现在&#xff0c;当你…

39-2 Web应用防火墙 - WAF数据库层绕过

如果你本地没有安装mysql就先安装一下:4-2 MySQL 的下载与安装_mysql5.7.9.1下载-CSDN博客 一、数据库层绕过简介 绕过数据库层通常用于规避Web应用防火墙(WAF)的SQL注入防护规则。攻击者需要利用数据库特性,寻找规避常规安全策略的方法。这里涉及到不同数据库的特性、SQ…

Python基础详解三

一&#xff0c;函数的多返回值 def methodReturn():return 1,2x,ymethodReturn() print(x,y) 1 2 二&#xff0c;函数的多种参数使用形式 缺省参数&#xff1a; def method7(name,age,address"淄博"):print("name:"name",age"str(age)&quo…