当前位置: 首页 >文章 > 二叉树的垂序遍历
收藏
分享

二叉树的垂序遍历

举报小虎转载君小虎转载君发布于 2021-08-09878阅读0点赞
如果同行同列上有多个结点,则按结点的值从小到大进行排序。...

问题描述

来源:LeetCode第987题
难度:困难

给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)(row+1,col+1)。树的根结点位于(0,0)。


二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。

返回二叉树的垂序遍历序列。

示例 1:

输入:root = [3,9,20,null,null,15,7]

输出:[[9],[3,15],[20],[7]]

解释:

列 -1 :只有结点9在此列中。

列 0 :只有结点3和15在此列中,按从上到下顺序。

列 1 :只有结点20在此列中。

列 2 :只有结点7在此列中。

示例 2:

输入:root = [1,2,3,4,5,6,7]

输出:[[4],[2],[1,5,6],[3],[7]]

解释:

列 -2 :只有结点4在此列中。

列 -1 :只有结点2在此列中。

列 0 :结点1、5和6都在此列中。

1在上面,所以它出现在前面。

5和6位置都是(2,0),所以按值从小到大排序,5在6的前面。

列 1 :只有结点3在此列中。

列 2 :只有结点7在此列中。

示例 3:

输入:root = [1,2,3,4,6,5,7]

输出:[[4],[2],[1,5,6],[3],[7]]

解释:

这个示例实际上与示例2完全相同,只是结点5和6在树中的位置发生了交换。

因为5和6的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。

提示:


树中结点数目总数在范围[1,1000]内

0 <= Node.val <= 1000

问题分析

这题虽然是hard,但其实没有什么难度,做这题我最先想到的就是BFS遍历,如果当前节点是第m列,那么他的左子节点就是第m-1列,右子节点就是m+1列

所以我们可以从上到下一层一层的遍历,使用一个map来存储,map的key存储的是第几列,value是那个列的集合。辛辛苦苦写完之后发现运行不通过(代码放在了下面,有兴趣的可以看下),这是因为题中有这样一句话,如果同行同列上有多个结点,则按结点的值从小到大进行排序。也就是说如果两个节点位置重合了还要按照大小进行排序。

所以这题我们只能按照常规方式来解决,就是先记录下每个节点的值和坐标,最后再把他们按照同一列的顺序放到集合中,关于二叉树的遍历有多种,我们之前也介绍过一些

373,数据结构-6,树
488,二叉树的Morris中序和前序遍历

来看下代码

//错误的代码(同一行和同一列的两个值没有按照大小进行排序)



本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号:数据结构和算法!


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,637人)

电商海报设计训练营
距离开班仅剩9天66人已报名
【5月】零基础手绘插画训练营
距离开班仅剩9天56人已报名
【5月】零基础动态表情包创作训练营
距离开班仅剩26天15人已报名
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习89000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了27,078
并提交了210份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 89000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证