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

news2024/11/24 1:03:45

二叉树的垂序遍历

  • 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.coloradmin.cn/o/745275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI文本标注的概念,类型和方法

我们每天都在与不同的媒介&#xff08;例如文本、音频、图像和视频&#xff09;交互&#xff0c;我们的大脑对收集到的信息进行处理和加工&#xff0c;从而指导我们的行为。在我们日常接触到的信息中&#xff0c;文本是最常见的媒体类型之一&#xff0c;由我们交流使用的语言构…

优化SQL查询实现高效数据检索(一)

大家好&#xff0c;SQL&#xff08;结构化查询语言&#xff09;可以帮助大家从数据库中收集数据&#xff0c;它是专为此而设计的&#xff0c;换句话说&#xff0c;它使用行和列来处理数据&#xff0c;让使用者能够使用SQL查询来操作数据库中的数据。 SQL查询 SQL查询是一系列…

11-2.箭头函数与函数的this问题

目录 1 箭头函数 1.1 基本使用 1.2 在只有一个参数的时候&#xff0c;小括号可以省略 1.3 只有一行时&#xff0c;可以省略大括号 1.4 只有一行时的return问题 1.5 直接返回一个对象 1.6 箭头函数使用剩余参数 2 this问题 2.1 直接打印this 2.2 fucntion定…

接口工具Postman知多少

目录 前言&#xff1a; Postman简介 如何使用Postman 1&#xff09;主界面 2&#xff09;测试用例的创建 3&#xff09;请求结果 4&#xff09;测试集的创建 使用方法&#xff1a; 前言&#xff1a; Postman是一个流行的API开发和测试工具&#xff0c;它提供了丰富的功…

38. QT在工控机Linux系统上调试机器人注意事项

1. QtCreator项目编译目录问题 当使用QtCreator创建一个新项目之后,对于代码编译产生的最终文件保存路径一般也会确定下来,QtCreator会帮助我们在同级目录下创建保存路径。例如下图:带有蓝色框的文件夹为项目源码,左侧的文件夹即为项目编译后产生的文件夹 如果在某种情况…

Unity | 向量、矩阵、齐次坐标

目录 一、向量点乘&叉乘 1.点乘 1.1 公式 1.2 几何意义 2.叉乘 2.1 公式 2.2 几何意义 二、矩阵点乘&叉乘 1.矩阵 2.矩阵的点乘 3.矩阵的叉乘 三、矩阵旋转 四、齐次坐标 一、向量点乘&叉乘 1.点乘 又称内积&#xff0c;结果是个标量&#xff0c; 1…

LIS医学检验信息系统 智慧检验实验室系统源码

医学检验信息系统(LIS)涵盖实验室的全部管理流程&#xff0c;包括从检验申请、标本采集、实验检测、报告发布的完整流程&#xff0c;以及质控管理、科室事务、试剂管理等功能&#xff0c;遵循医学实验室认可标准ISO15189的要求规范&#xff0c;适合各种实验机构的业务流程。 …

【MySQL】MySQL 数据类型,数值、日期和时间、字符串类型,创建数据表,删除数据表

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停

文章目录 问题场景排查过程处理解决事后反思 问题场景 我们的平台服务使用docker部署&#xff0c;使用docker-compose进行管理&#xff0c;部署到CentOS7的服务器里平台部署到客户环境时&#xff0c;一小部分客户&#xff0c;使用自己机房或单独的服务器。很多客户不愿意采购新…

进程之间的数据交互(使用管道和套接字实现进程通信)

本篇目录 进程通信的方法有哪些C语言使用管道实现进程通信使用管道进行实时通信 C语言使用套接字进行进程通信 进程通信的方法有哪些 进程通信是指在操作系统中&#xff0c;不同进程之间进行数据传递、信息共享和协调工作的方法。以下是常见的进程通信方法&#xff1a; 管道&a…

Linux网络第五章——YUM和NFS共享服务—YUM

YUM简介&#xff1a; 是一个专门为了解决包的依赖关系而存在的软件包管理器。 可以一键下载&#xff0c;一键安装和卸载。yum 是改进型的 RPM 软件管理器&#xff0c; 它解决了 RPM 所面临的软件包依赖问题。 yum 在服务器端存有所有的 RPM 包&#xff0c;并将各个包之间的依…

相比传统ERP,基于项目的ERP系统有何不同?

服务型企业是独特的以人为本的组织&#xff0c;依靠员工来销售、配置和提供一系列的产品和服务&#xff0c;这通常是以项目或合同为基础。 在这样一个环境中&#xff0c;服务型企业的基本财务要求与传统的制造和供应链型企业有很大的不同。 基于项目的企业需要管理资源&#x…

2023最新 Navicat 16.2.3 安装和学习试用连接Redis教程详解

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

IIS8 安装 .net1.1

直接上正文&#xff1b; 一 安装补丁 安装顺序&#xff1a; 1 dotnetfx.exe 2 NDP1.1sp1-KB867460-X86 3 NDP1.1sp1-KB886903-X86 .NET_Framework_Cleanup_Tool.zip&#xff08;这个是卸载.net framework的软件&#xff0c;后面可能会用&#xff09; 链接&#xff1a;ht…

ubuntu软件商店换阿里源,并解决更新源报错-->无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32

目录 一、背景 二、给源文件备份 三、更新源 四、解决报错 五、继续更新源 六、完成更新&#xff0c;下载应用 一、背景 重装了个ubuntu&#xff0c;发现软件商店用不了&#xff0c;打算换源。 二、给源文件备份 1&#xff09;登录ubuntu系统&#xff0c;打开终端&…

mybatis双重foreach实现遍历map中的两个list数组

文章目录 实现背景&#xff1a;前端传值的格式Debug断点调试java如何解析json对象第一步 JSONArray.fromObject()第二步 遍历jsonArray第三步 mybatis双重foreach foreach标签说明最终效果 实现背景&#xff1a; 前端传值时可能会有多个字段传递过来&#xff0c;需要后台将这多…

SpringBoot + WebSocket+STOMP指定推送消息

目录 一、前提条件1.2 环境要求1.3 依赖 二、相关工具类准备2.1 发送消息载体2.2 接收消息载体2.3 消息处理接口2.4 为 STOMP 消息传递配置 Spring 三、前端部分四、效果 一、前提条件 本文将简单的描述SpringBoot WebSocketSTOMP指定推送消息场景&#xff0c;不包含信息安全加…

搭建FRP内网穿透服务器来远程访问本地windows/linux中的web服务

什么是FRP&#xff1f; FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。 FRP有服务端和客户端&#xff0c;你将服务端安装在你买的便宜云服务器上&#xff0c;FRP客户端安装在你自己的…

数据标注是什么?

关于数据标注您需要了解的一切——专家解答&#xff1a;澳鹏产品管理总监Meeta Dash 人工智能&#xff08;AI&#xff09;的质量取决于对其予以训练所使用的数据。由于训练数据的质量和数量直接决定AI算法的成败&#xff0c;因此&#xff0c;对于一个AI项目&#xff0c;平均80…

简单线性回归评估指标+R Squared

使得每一个数据集尽可能的小 均方误差MSE&#xff1a;&#xff08;平方和取平均值&#xff09; 均方根误差RMSE&#xff1a;&#xff08;平方和取平均值开根号&#xff09;&#xff1a;平均误差值 平均绝对误差MAE&#xff1a;&#xff08;绝对值取平均&#xff09;&#xff1a…