链接:https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree

题目描述

给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。

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

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

解题思路

第一步:计算出所有节点的坐标

第二步:按照顺序输出这些坐标所对应的值

解题代码

package com.yucheng;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;public class Solution987 {public static void main(String[] args) {TreeNode n20 = new TreeNode(15);TreeNode n22 = new TreeNode(7);TreeNode n11 = new TreeNode(20, n20, n22);TreeNode n_11 = new TreeNode(9);TreeNode root = new TreeNode(3, n_11, n11);Solution987 solution987 = new Solution987();System.out.println(solution987.verticalTraversal(root));}public List<List<Integer>> verticalTraversal(TreeNode root) {Stack<MyTreeNode> stack = new Stack<>();MyTreeNode newRoot = new MyTreeNode(root, 0, 0);stack.push(newRoot);Res[][] res = new Res[1000][2000];res[0][1000] = new Res();res[0][1000].list.add(root.val);while (!stack.empty()) {MyTreeNode father = stack.pop();if (father.treeNode.left != null) {MyTreeNode l = new MyTreeNode(father.treeNode.left, father.x + 1, father.y - 1);if (res[l.x][l.y + 1000] == null) {res[l.x][l.y + 1000] = new Res();}res[l.x][l.y + 1000].list.add(l.treeNode.val);stack.push(l);}if (father.treeNode.right != null) {MyTreeNode r = new MyTreeNode(father.treeNode.right, father.x + 1, father.y + 1);if (res[r.x][r.y + 1000] == null) {res[r.x][r.y + 1000] = new Res();}res[r.x][r.y + 1000].list.add(r.treeNode.val);stack.push(r);}}List<List<Integer>> ans = new ArrayList<>();for (int j = 0; j < 2000; j++) {ArrayList<Integer> line = new ArrayList<>();for (int i = 0; i < 1000; i++) {if (res[i][j] != null) {Collections.sort(res[i][j].list);line.addAll(res[i][j].list);}}if (line.size() != 0) {ans.add(line);}}return ans;}}class MyTreeNode {TreeNode treeNode;int x;int y;MyTreeNode(TreeNode treeNode, int x, int y) {this.treeNode = treeNode;this.x = x;this.y = y;}}class Res {ArrayList<Integer> list;public Res() {this.list = new ArrayList<>();}}

Leetcode987 二叉树的垂序遍历相关推荐

  1. 987. 二叉树的垂序遍历

    给定二叉树,按垂序遍历返回其结点值. 对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1). 把一条垂线从 X = -infinity 移动到 X ...

  2. LeetCode 987. 二叉树的垂序遍历(递归/循环)

    1. 题目 给定二叉树,按垂序遍历返回其结点值. 对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1). 把一条垂线从 X = -infinity ...

  3. 刻意练习:LeetCode实战 -- 二叉树的后序遍历

    背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...

  4. 二叉树的先序遍历(非递归)

    虽然递归简单理解,但是用递归内存开销大,耗时长,性能往往不如非递归方式 所以这里通过栈,用非递归方法实现二叉树的先序遍历 二叉树的存储结构定义: typedef struct node{int dat ...

  5. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java

    <LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...

  6. 树结构练习——排序二叉树的中序遍历(二叉搜索树)

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...

  7. 1.二叉树的中序遍历

    题目:给出一棵二叉树,返回其中序遍历 /** * Definition of TreeNode:  * class TreeNode {  * public:  *     int val;  *   ...

  8. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  9. LeetCode-二叉树-94. 二叉树的中序遍历

    描述 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root ...

最新文章

  1. linux内核 cpu_die,解密“内核”,和“cpu”又有啥关系?
  2. 客户端如何通过咏南中间件调用存储过程和数据分页查询和文件传输的演示
  3. 自动化系列-pyppeteer键盘输入点击
  4. 集合使用与内部实现原理
  5. JRebel Idea热更新插件
  6. 基于JAVA+SpringMVC+MYSQL的家政服务平台
  7. 如何使用SQL Server Reporting Services创建图像分类系统
  8. C#获取MySql 数据常用的代码
  9. 【bzoj1593-预定旅馆】线段树维护连续区间
  10. 大话数据结构 前言
  11. java劳务派遣信息管理系统servlet员工社保工资信息jsp源码mysql
  12. 跟张小龙学习做优秀产品经理的设计思路
  13. everedit 格式化json_Bracket 使用指南
  14. VR技术在数据中心3D机房中的应用(下)
  15. 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享
  16. MT6737/MT6737T/MT6737M处理器功能介绍,MT6737芯片资料
  17. hash碰撞处理方法
  18. Centos8 安装 MySQL8.0.26
  19. TabbedProperties实现
  20. uniapp 自定义基座后软件打不开,屡次关闭

热门文章

  1. ffmpeg与x264有什么区别?
  2. yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
  3. Intel Realsense D435 hardware_reset()后循环打印测试len(ctx.query_device())结果
  4. Intel Realsense D435 如何获取摄像头的内参?get_profile() video_stream_profile() get_intrinsics()
  5. oracle 查询表字段6,Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、...
  6. centos7安装Filebeat采集日志文件存到Elasticsearch
  7. python update_python 字典中的Update()函数
  8. python术语中英对照栈图_Python常用技术栈总结
  9. anydesk截屏技术
  10. win10获取NTLM哈希