987. 二叉树的垂序遍历

news2024/10/9 2:28:15

987. 二叉树的垂序遍历

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • 对中文的支持有点不友好
    • IDEA

原题链接:

987. 二叉树的垂序遍历

https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/description/

完成情况:

在这里插入图片描述

解题思路:

 题目解释,即按输入构造出一个二叉树
 然后对树中的节点,赋予(row、col)
 左移row-1,右移row+1
 向下则col+1

 然后按col从小到大,再按row从小到大输出。

 我们可以从根节点开始,对整棵树进行一次遍历,
 在遍历的过程中使用数组 nodes记录下每个节点的行号 row,列号 col以及值 value。
 在遍历完成后,我们按照 col为第一关键字升序,row为第二关键字升序,value为第三关键字升序,对所有的节点进行排序即可。
 在排序完成后,我们还需要按照题目要求,将同一列的所有节点放入同一个数组中。
 因此,我们可以对 nodes进行一次遍历,并在遍历的过程中记录上一个节点的列号 lastcol。
 如果当前遍历到的节点的列号 col 与 lastcol相等,则将该节点放入与上一个节点相同的数组中,否则放入不同的数组中。

参考代码:

对中文的支持有点不友好

/**
 * 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 {
	public List<List<Integer>> verticalTraversal(TreeNode root) {
		List<int []> nodes = new ArrayList<int []>();
		dfs_verticalTraversal(root,0,0,nodes);   //dfs的过程中,要记录下每个节点的row值,和col值.
		Collections.sort(nodes, new Comparator<int[]>() {   //定义出比较器方法
			@Override
			public int compare(int[] o1, int[] o2) {
				if (o1[0] != o2[0]){
					return o1[0] - o2[0];
				} else if (o1[1]!=o2[1]) {
					return o1[1] - o2[1];
				}else {
					return o1[2] - o2[2];
				}
			}
		});
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		int size = 0;
		int lastCol = Integer.MIN_VALUE;
		for (int [] tuple : nodes){
			int col = tuple[0],row = tuple[1],value = tuple[2];
			if (col != lastCol){
				lastCol = col;
				res.add(new ArrayList<Integer>());
				size++;
			}
			res.get(size - 1).add(value);
		}
		return res;
	}

	private void 	dfs_verticalTraversal(TreeNode curNode, int row, int col, List<int[]> nodes) {
		// if (nodes == null){
		// 	return;
		// }
		// nodes.add(new int[]{col,row,curNode.val});
		// dfs_垂序遍历(curNode.left,row+1, col - 1, nodes);
		// dfs_垂序遍历(curNode.right,row+1, col + 1, nodes);
        if (curNode == null) {
            return;
        }
        nodes.add(new int[]{col, row, curNode.val});
        dfs_verticalTraversal(curNode.left, row + 1, col - 1, nodes);
        dfs_verticalTraversal(curNode.right, row + 1, col + 1, nodes);
	}
}

IDEA

package 西湖算法题解___中等题02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class __987二叉树的垂序遍历 {
	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;
		}
	}

	/**
	 题目解释,即按输入构造出一个二叉树
	 然后对树中的节点,赋予(row、col)
	 左移row-1,右移row+1
	 向下则col+1

	 然后按col从小到大,再按row从小到大输出。

	 我们可以从根节点开始,对整棵树进行一次遍历,
	 在遍历的过程中使用数组 nodes记录下每个节点的行号 row,列号 col以及值 value。
	 在遍历完成后,我们按照 col为第一关键字升序,row为第二关键字升序,value为第三关键字升序,对所有的节点进行排序即可。
	 在排序完成后,我们还需要按照题目要求,将同一列的所有节点放入同一个数组中。
	 因此,我们可以对 nodes进行一次遍历,并在遍历的过程中记录上一个节点的列号 lastcol。
	 如果当前遍历到的节点的列号 col 与 lastcol相等,则将该节点放入与上一个节点相同的数组中,否则放入不同的数组中。

	 *
	 * @param root
	 * @return
	 */
	public List<List<Integer>> verticalTraversal(TreeNode root) {
		List<int []> nodes = new ArrayList<int []>();
		dfs_垂序遍历(root,0,0,nodes);   //dfs的过程中,要记录下每个节点的row值,和col值.
		Collections.sort(nodes, new Comparator<int[]>() {   //定义出比较器方法
			@Override
			public int compare(int[] o1, int[] o2) {
				if (o1[0] != o2[0]){
					return o1[0] - o2[0];
				} else if (o1[1]!=o2[1]) {
					return o1[1] - o2[1];
				}else {
					return o1[2] - o2[2];
				}
			}
		});
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		int size = 0;
		int lastCol = Integer.MIN_VALUE;
		for (int [] tuple : nodes){
			int col = tuple[0],row = tuple[1],value = tuple[2];
			if (col != lastCol){
				lastCol = col;
				res.add(new ArrayList<Integer>());
				size++;
			}
			res.get(size - 1).add(value);
		}
		return res;
	}

	private void dfs_垂序遍历(TreeNode curNode, int row, int col, List<int[]> nodes) {
		if (nodes == null){
			return;
		}
		nodes.add(new int[]{col,row,curNode.val});
		dfs_垂序遍历(curNode.left,row+1, col - 1, nodes);
		dfs_垂序遍历(curNode.right,row+1, col + 1, nodes);
	}
}

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

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

相关文章

2.3 Java中的运算符

运算符&#xff0c;是表示各种不同运算的符号。 运算符按功能分为算术运算符、逻辑运算符、关系运算符、赋值运算符、位运算符等。 1. 算术运算符 算术运算符一般用于对整型数和浮点型数运算。 运算符 运算 范例 结果 正号 3 3 - 负号 b4;-b -4 加 55 10 …

恒运资本:开盘时间是几点到几点?

开盘时刻是指各种商场的正式开端生意时刻&#xff0c;包括股票商场、外汇商场、商品期货商场等。关于出资者来说&#xff0c;了解开盘时刻是十分重要的&#xff0c;由于它直接关系到生意的时刻和机会。本文将从多个角度分析开盘时刻的重要性、不同商场的开盘时刻以及对出资者带…

linux环境部署jmeter并执行测试

下载jmeter和jdk jmeter官网和java-jdk官网下载压缩包文件 jmeter下载地址&#xff1a;点此下载 jmeter Apache JMeter - Download Apache JMeter java-jdk下载地址&#xff1a;点此下载 jdk Java Downloads | Oracle 安装包根据Linux配置进行选择。 上传文件到Linux并解压文…

大厂案例 - 海量分类业务设计的一些思考

文章目录 业务背景描述方案演进v1 扩展字段扩展性需求查询需求 v2 垂直拆分拆分方案存在的问题 v3 三大中心服务 &#xff08;业界最佳实践&#xff09;统一帖子中心服务统一类目属性服务统一检索服务 小结 业务背景描述 一个分类信息平台&#xff0c;有很多垂直品类&#xff…

LeetCode(力扣)47.全排列 IIPython

LeetCode47.全排列 II 题目链接代码 题目链接 https://leetcode.cn/problems/permutations-ii/ 代码 class Solution:def permuteUnique(self, nums):nums.sort() # 排序result []self.backtracking(nums, [], [False] * len(nums), result)return resultdef backtrackin…

【Python】多线程

进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a;就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运行进程&#xff0c;并分配进程ID…

JavaScript学习笔记02

JavaScript笔记02 数据类型详解 字符串 在 JavaScript 中正常的字符串都使用单引号 或者双引号" "包裹&#xff1a;例&#xff1a; 转义字符 在 JavaScript 字符串中也可用使用转义字符&#xff08;参考&#xff1a;详解转义字符&#xff09;&#xff1a;例&…

电工什么是电动势

什么是电动势&#xff1f;及电源电动势计算公式与方向确定 前面我们讲到在基本电路中的电流和电压的基础知识&#xff0c;而本文要讲的电动势和电压是一个很类似的概念。那么什么是电动势&#xff1f;电源电动势的计算公式是什么&#xff1f;它的方向如何确定及与电压有什么区…

【C语言】找单身狗问题

一.找单身狗问题初阶 1.问题描述 一个数组中只有一个数字是出现一次,其他所有数字都出现了两次.编写一个函数,找出这个只出现一次的数字. 例如: 有数组的元素是:1,2,3,4,5,1,2,3,4 只有5出现了一次,要找出5. 2.解题思路 常规思路: 在常规思路中,我们首先想到的肯定是使用两层…

腾讯云新用户有哪些优惠政策和专属活动?

腾讯云作为中国领先的云计算服务提供商&#xff0c;一直在为用户提供优质、高效且具有竞争力的服务。对于新用户&#xff0c;腾讯云更是诚意满满&#xff0c;推出了一系列优惠政策和专属活动。本文将详细介绍腾讯云新用户的优惠政策和专属活动&#xff0c;帮助大家更好地了解如…

ArcGIS 10.6安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…

android注解之APT和javapoet

前言 前面我们已经讲过注解的基本知识&#xff0c;对于注解还不太了解的&#xff0c;可以去看一下之前的文章&#xff0c; android 注解详解_袁震的博客-CSDN博客。 之前我们在讲注解的时候&#xff0c;提到过APT和JavaPoet&#xff0c;那么什么是APT和JavaPoet呢&#xff1…

pprof火焰图性能优化

pprof火焰图性能优化 火焰图&#xff08;flame graph&#xff09;是性能分析的利器,在go1.1之前的版本我们需要借助go-torch生成,在go1.1后go tool pprof集成了此功能,今天就来说说如何使用其进行性能优化 在你启动http server的地方直接加入导入: _ “net/http/pprof” 获取…

如何在 7 分钟内黑掉 40 个网站

这将详细讲述我如何侵入托管 40 个(这是一个确切数字)网站的服务器以及我的发现。 注意:需要一些必备的 CS 知识才能理解本文的技术部分。 一位朋友给我发消息说他的网站发现了XSS 漏洞,希望我进一步查看。这是一个重要的阶段,因为我倾向于要求他正式表示我已获得他的许可…

Mojo 摸脚语言,似乎已经可以安装

文章原地址&#xff1a;https://i.scwy.net/it/2023/090821-mojo/ Mojo 吹得很凶&#xff0c;面向AI编程&#xff0c;甩Python几十条街&#xff0c;融资上亿.... 但无缘一试&#xff0c;在Win和Ubuntu上试都不能通过。 由 LLVM 和 Swift 编程语言的联合创始人 Chris Lattner…

荣耀崛起阵容推荐,荣耀崛起最强阵容

今天给大家带来的荣耀崛起阵容推荐是新手阵容推荐&#xff0c;以核心输出为点&#xff0c;由点及面&#xff0c;来展开叙述阵容&#xff01; 关注【娱乐天梯】&#xff0c;获取荣耀崛起0.1折内部福利号 荣耀崛起最强阵容兽族战神流&#xff1a; 此阵容是以战士为核心&#xff0…

pycharm使用

在使用pycharm时&#xff0c;有时一个回车或者一个tab键&#xff0c;缩进的长度不符合预期可以调整设置tab键缩进的长度&#xff1a; 平时工作中&#xff0c;不同的人在编辑代码缩进的时候&#xff0c;有的人喜欢按四个或者六个空格&#xff0c;有的人喜欢按tab键&#xff0c;而…

网络变压器/网络滤波器(脉冲变压器)选型/定制要明确的要求

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;1,做电路板项目开发的工程师有时会遇到开发标的的空间限制&#xff0c;要对电子元器件的占用空间进行优化&#xff0c;同样电性参数的产品有的产品选择性比较小,只有部分产品有可选择性,这就给工程师进行板子空间优…

OJ练习第167题——单词接龙

单词接龙 力扣链接&#xff1a;127. 单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&…

ES快速学习

ES 用于&#xff1a;存储、分析、检索 的工具 组成及与类比到mysql组成 倒排索引