leetcode 987. 二叉树的垂序遍历(java)

二叉树的垂序遍历

  • leetcode 987. 二叉树的垂序遍历
    • 题目描述
    • DFS + 优先队列(堆)
    • 代码演示
  • 二叉树专题

leetcode 987. 二叉树的垂序遍历

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree

题目描述

给你二叉树的根结点 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

DFS + 优先队列(堆)

解题思路,
首先把节点信息封装成一个数组.
int[]info = new int[3];
左树: info[0] = col - 1; 右树: info[0] = col + 1;
info[1] = row + 1;
封装成信息,加到优先级队列中,然后,定好排序规则.
然后从优先级队列中取出数据就是答案了

代码演示

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/class Solution {/*** 优先级队列*/static PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> {//不是同一列时,列小的排前面if (a[0] != b[0]) {return a[0] - b[0];}//同一列时,高度低的排前面if (a[1] != b[1]) {return a[1] - b[1];}//按大小排序return a[2] - b[2];});/*** 垂序遍历* @param root* @return*/public static List<List<Integer>> verticalTraversal(TreeNode root){int[] info = {0, 0, root.val};queue.add(info);dfs(root,info);List<List<Integer>> ans = new ArrayList<>();while (!queue.isEmpty()){ArrayList<Integer> list = new ArrayList<>();int[] peek = queue.peek();//同一列的放到一个数组集合中while (!queue.isEmpty() && queue.peek()[0] == peek[0]){list.add(queue.poll()[2]);}ans.add(list);}return ans;}/*** 递归* @param root* @param f*/public static void dfs(TreeNode root,int[]f){if (root.left != null){int[] lInfo = {f[0] - 1, f[1] + 1, root.left.val};queue.add(lInfo);dfs(root.left,lInfo);}if (root.right != null){int[]rInfo = {f[0] + 1,f[1] + 1, root.right.val};queue.add(rInfo);dfs(root.right,rInfo);}}}

二叉树专题

leetcode111. 二叉树的最小深度

leetcode814. 二叉树剪枝

leetcode257. 二叉树的所有路径

leetcode863. 二叉树中所有距离为 K 的结点

剑指 Offer 04. 二维数组中的查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/17634.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea支持vue文件-设置对vue的支持

一、idea支持.vue文件 这一步其实就是安装vue.js插件&#xff0c;具体路径为&#xff1a;File ----> Settings ----> Plugins ----> 输入vue&#xff0c;点击搜索结果里的vue.js右边的install按钮&#xff0c;安装成功后重启idea&#xff0c;这样idea就能识别.vue文件…

密码学证明方案寒武纪大爆发——扩容、透明性和隐私的变革潜力

1. 引言 前序博客有&#xff1a; ZKP大爆炸 本文主要参考&#xff1a; StarkWare 2023年6月博客 Cambrian Explosion of Cryptographic Proofs----The transformative potential for scalability, transparency, and privacy2023年3月Eli Ben-Sasson在The 13th BIU Winter …

MySQL---表数据高效率查询(简述)

目录 前言 一、聚合查询 &#x1f496;聚合函数 &#x1f496;GROUP BY子句 &#x1f496;HAVING 二、联合查询 &#x1f496;内连接 &#x1f496;外连接 &#x1f496;自连接 &#x1f496;子查询 &#x1f496;合并查询 &#x1f381;博主介绍&#xff1a;博客名…

ViperGPT解析:结合视觉输入与文本查询生成和执行程序

ViperGPT&#xff1a;结合视觉输入与文本查询生成和执行程序 ViperGPT 是一个混合视觉和语言处理模型&#xff0c;旨在解决视觉查询问题。这种问题需要视觉处理和推理能力的结合&#xff0c;ViperGPT通过利用代码生成模型&#xff0c;将视觉和语言模型组合成子例程&#xff0c…

优秀的 RocketMQ 可视化管理工具 GUI 客户端

优秀的 RocketMQ 可视化管理工具 GUI 客户端 官网地址&#xff1a;http://www.redisant.cn/rocketmq 快速查看所有 RocketMQ 集群&#xff0c;包括Brokers、Topics和Consumers查看消费者订阅了哪些主题&#xff0c;以及消息队列被分配给了哪些消费者&#xff1b;当出现消息积…

Elasticsearch【安装ES服务、安装kibana、Docker安装 、索引操作、文档操作】(二)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch安装_安装ES服务 Elasticsearch安装_安装kibana Elasticsearch安装_Docker安装 Elasticsearch常用操作_索引操作 Elasticsearch常用操作_文档操作 Elasticsearch安装_安装ES服务 准备工作 1、 准备一台搭载有CentOS7系统的虚拟机&#xff0c;使用XSh…

Kafka入门,漏消费和重复消费, 消费者事务,数据积压(二十四)

漏消费和重复消费 重复消费&#xff1a;已经消费了数据&#xff0c;但是offset没提交。 漏消费&#xff1a;先提交offset后消费&#xff0c;有可能会造成数据得漏消费 消费者事务 如果向完成consumer端得进准一次性消费&#xff0c;那么需要Kafka消费端将消费过程和提交offs…

Bootloader Design of PIC18 series MCU - 进阶篇

1.遭遇到问题 在&#xff1a;PIC18 Bootloader 设计基础 一文中&#xff0c;我们讨论了Bootloader与上层应用APP各自编译的方法。在ROM上的空间分配、以及跳转、中断的处理等内容。那篇文章包含了所有与PIC单片机Bootloader设计相关的技术问题。但是距离一个真正可用的Bootloa…

【C语言】多组输入

C系列文章目录 目录 C系列文章目录 一、什么是多组输入&#xff1f; 二、如何使用多组输入 2.1&#xff0c;试题举例讲解 2.2&#xff0c;错误解法 2.3&#xff0c;我们实现多组输入的思路 2.4&#xff0c;第一种正确的解法 2.5&#xff0c;第二种正确的解法 2.6&…

结合具体场景举例说明chatgpt预训练模型中Tokenization的原理

假设我们有一个场景&#xff0c;Alice想向Chatbot询问一部电影的推荐。她发送了一条消息&#xff1a;“你好&#xff0c;能给我推荐一部好看的电影吗&#xff1f;” 在这个场景中&#xff0c;Chatbot使用了ChatGPT预训练模型。首先&#xff0c;Chatbot需要对Alice的消息进行Tok…

视频无损放大修复工具:Topaz Video AI对Mac和Windows的系统要求

Topaz Video AI是一款基于人工智能技术的视频增强软件&#xff0c;旨在提供高质量的视频修复、增强和转换功能。它可以通过智能算法和图像处理技术&#xff0c;改善视频的清晰度、稳定性、降噪效果&#xff0c;还能进行视频转码和格式转换。 Mac&#xff1a;Topaz Video AI fo…

性能监控平台 | Prometheus+InfluxDB + Grafana!

在本文中&#xff0c;我将把几个常用的监控部分给梳理一下。前面我们提到过&#xff0c;在性能监控图谱中&#xff0c;有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。显然这些监控点不能在一个专栏中…