LeetCode 分类刷题:987. 二叉树的垂序遍历

题目

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

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

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

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

解析

// 怎么递归?

// 深度遍历每个节点,从根节点往下一层传递行号和列号

// 其中左子树行号为父节点行号+1,列号-1;右子树行号为父节点行号+1,列号+1

// 设置一个Map存储深度遍历的节点,键为列号,值为该列的 行号, 节点值 列表。

// DFS 时将节点添加到对应列的列表中,最后按列排序、每列内按行排序。

// 按列号从小到大,遍历map中每一个列号键对应的 行号, 节点值 值列表:

// 对值列表中的每个元素 行号, 节点值 ,先按行号从小到大,行号相同再按节点值按从小到大排序

// 将 行号, 节点值 列表中的节点值取出构成一个新列表,将列表放到答案列表里

// 最后返回答案列表。

答案

javascript 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var verticalTraversal = function(root) {
    let res = [];
    const map = new Map();
    function dfs(node, row, col) {
        if(node === null) return;
        let list = map.get(col) || [];
        list.push([row, node.val]);
        map.set(col, list);
        dfs(node.left, row + 1, col - 1);
        dfs(node.right, row + 1, col + 1);
    }
    dfs(root, 0, 0);
    const cols = Array.from(map.keys()).sort((a, b) => a - b);
    for (const col of cols) {
        const nodes = map.get(col);
        nodes.sort((a, b) => a[0] - b[0] || a[1] - b[1]); 
        // 先按行号,行号相同按值
        const values = nodes.map(node => node[1]);
        res.push(values);
    }
    return res;
};

复杂度分析

时间复杂度:O(nlogn),其中 n 为二叉树的节点个数。瓶颈在排序上。

空间复杂度:O(n)。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/solutions/2638913/si-chong-xie-fa-dfsha-xi-biao-shuang-shu-tg6q/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
祖力553 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省5 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7986 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI7 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型8 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光8 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院9 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡10 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构