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

news/2024/5/19 21:53:47

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

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

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,发现过程确实复杂一些,不能从上到下遍历。这是我原来的代码:

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.mrgr.cn/p/88125257

相关文章

SparkSql介绍

概述 SparkSQL,顾名思义,就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL,而叫Shark,最开始的时候底层代码优化,sql的解析、执行引擎等等完全基于Hive&#xff0c…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中,我们一起进行了FreeBSD RISCV 在QEME中实践 现在,让我们配置好网络吧! 先上结论:用默认配置启动即可,网络就加载好了,只是不能ping罢了。因为不能ping,以为网络没通&#xff0…

excel如何将多列数据转换为一列?

这个数据整理借用数据透视表也可以做到: 1.先将数据源的表头补齐,“姓名” 2.点击插入选项卡,数据透视表,在弹出对话框中,数据透视位置选择 现有工作表,(实际使用时新建也没有问题)…

学习笔记480—Obsidian中如何实现思维导图功能-mindmap插件

Obsidian中如何实现思维导图功能-mindmap插件 思维导图插件 思维导图是大家耳熟能详的一类软件,以xmind为代表。那么在obsidian中如何实现思维导图效果呢,本文介绍思维导图插件Enhancing mindmap的安装与使用过程。 效果图插件下载 Github地址: https://github.com/MarkMind…

初识Fink

概述 Fink用于处理计算的,如下图所示,将交易、日志、物联网、点击流的数据输入到Flink中进行处理计算,处理完成之后输出到应用、日志、数据库中。Flink是以流的方式对数据进行处理的,所谓流就是源源不断,每时每刻都在有序的产生,例如设备仪器运行数据就属于数据流,因为设…

三角函数之和差化积公式

知识点1:三角函数奇偶性: \(\sin(-\theta)=-\sin\theta, \quad \cos(-\theta)=\cos\theta\)如上图: 单位半圆的半径为1,\(\triangle AOB\)为等腰三角形。 点\(C\)为线段\(AB\)之中点,连接\(CO\)。 根据等腰三角形的性质,\(OC\) 是 \(△AOB\) 的角平分线和垂直平分线。 \(…

每日一题 礼物的最大价值

题目描述 礼物的最大价值_牛客题霸_牛客网 解题思路 这是一个典型的动态规划问题。我们可以使用一个二维数组 dp[][] 来存储到达每个格子时可以获得的最大价值。状态转移方程为 dp[i][j] max(dp[i-1][j], dp[i][j-1]) grid[i][j],表示到达当前格子的最大价值是从…

android init进程启动流程

一,Android系统完整的启动流程 二,android 系统架构图 三,init进程的启动流程 四,init进程启动服务的顺序 五,android系统启动架构图 六,Android系统运行时架构图 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// imme…

buuctf-pwn-get_started_3dsctf_2016

题目地址:https://buuoj.cn/challenges#get_started_3dsctf_2016 检查一下保护情况拖进ida分析主函数有个很明显的栈溢出漏洞 没有找到system函数,但是发现了这个函数后面有两种解题思路 0x01 调用get_flag函数 这个函数读取了flag.txt,并输出内容,那么我们就想办法溢出到这…

再议大模型微调之Zero策略

1. 引言 尽管关于使用Deepspeed的Zero策略的博客已经满天飞了,特别是有许多经典的结论都已经阐述了,今天仍然被问到说,如果我只有4块40G的A100,能否进行全量的7B的大模型微调呢? 正所谓“纸上得来终觉浅,…

《Video Mamba Suite》论文笔记(1)Mamba在时序建模中的作用

原文链接 https://arxiv.org/abs/2403.09626https://arxiv.org/abs/2403.09626 原文代码 https://github.com/OpenGVLab/video-mamba-suitehttps://github.com/OpenGVLab/video-mamba-suite 原文笔记 What 《Video Mamba Suite: State Space Model as a Versatile Altern…

群晖存储池损毁,加上错误操作删除

如何联系本人? 储存池被我误删除了,导致无法正常通过,格式化群晖第一、第二分区进行恢复。系统损毁了,先导出群晖设置,进入pe使用DiskGenius格式化你所有硬盘的第一个和第二个分区(大约是1-2个G大小的分区)切记不是删除分区, 第三个分区千万不要动,那是数据分区,然后…

普洱茶泡多少茶叶才算淡茶?

普洱茶淡茶一般放几克茶叶,品深茶官网根据多年专业研究与实践结果,制定了淡茶冲泡标准。在冲泡普洱茶淡茶时,茶叶的投放量是关键因素之一。淡茶冲泡标准旨在保持茶汤的清爽口感,同时充分展现普洱茶的独特风味。 根据《品深淡茶冲…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法,通过边界索引确定中间索引,判断中间索引处的元素值和目标值的大小,来不断缩小查找区间。使用二分查找有如下一些限制&#…

nginx模型设计和进程讲解

一. Nginx进程模型解析 1. master主进程 和 worker工作进程 [rootlocalhost sbin]# ps -ef|grep nginx root 15411 1 0 21:08 ? 00:00:00 nginx: master process ./nginx nobody 15412 15411 0 21:08 ? 00:00:00 nginx: worker process root…

干货分享-策划人都在用的活动策划网站

职场上,学会借力,学会‘抄’,比辛辛苦苦做老黄牛,更能事倍功半,不仅自己省事省力,还能获得更多升职加薪的机会。 那么,职场新人如何快速的写出一份领导满意的方案? 今天分享的‘抄…

ue引擎游戏开发笔记(33)——武器与角色的匹配,将新武器装备到角色身上

1.需求分析: 武器能出现在世界中,完成了第一步,下一步需要角色和武器适配,即不论角色跑动,射击等,武器和角色都相匹配,将武器装备到角色身上。 2.操作实现: 1.首先先把角色原有的武…

C语言栈的含义与栈数据操作代码详解!

引言:在本篇博客中,我们将学到数据结构——栈,讲到栈的含义与关于栈的数据操作代码。栈可以在顺序表、双向链表以及单链表的基础上实现,而于本篇博客中,我们选择在顺序表的基础上实现栈。 更多有关C语言和数据结构知识…

Shell编程规范与变量

目录1.Shell脚本概述2.Shell编程规范(1)编写脚本代码(2)脚本编写结构(3)Shell脚本的运行3.重定向与管道(1)交互式硬件设备(2)重定向操作(3)管道操作“|”4.Shell脚本变量(1)自定义变量(1)定义一个新的变量(2)赋值时使用引号(3)设置变量的作用范围(4)整数…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置,使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…