博客
关于我
leetcode---987. 二叉树的垂序遍历
阅读量:187 次
发布时间:2019-02-28

本文共 1625 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要实现一个二叉树的垂序遍历,并按特定规则返回结点值。垂序遍历是按照垂线移动的顺序,类似于从左下方到右下方的顺序。每个结点的位置由其X和Y坐标决定,遍历时,每当垂线碰到一个结点,就按Y坐标递减的顺序报告结点值。如果两个结点位置相同,首先报告的结点值较小。

方法思路

  • 垂序遍历定义:垂序遍历是按照垂线从左到右移动的顺序进行的。每个结点的位置由其X和Y坐标决定,左子结点在(X-1, Y-1),右子结点在(X+1, Y-1)。
  • 遍历记录:使用深度优先搜索(DFS)遍历二叉树,记录每个结点的位置和值。
  • 排序规则:将记录的结点按X坐标升序排列,如果X坐标相同,按Y坐标降序排列,如果Y坐标也相同,则按结点值升序排列。
  • 结果生成:按X坐标分组,生成最终结果列表。
  • 解决代码

    #include 
    #include
    using namespace std;struct node { int x; int y; int val;};static bool cmp(node a, node b) { if (a.x != b.x) { return a.x < b.x; } else if (a.y != b.y) { return a.y > b.y; } else { return a.val < b.val; }}void dfs(int x, int y, TreeNode* root) { if (root == nullptr) return; node t; t.x = x; t.y = y; t.val = root->val; vector
    & vn = ref; vn.push_back(t); if (root->left != nullptr) { dfs(x-1, y-1, root->left); } if (root->right != nullptr) { dfs(x+1, y-1, root->right); }}vector
    > verticalTraversal(TreeNode* root) { vector
    vn; dfs(0, 0, root); sort(vn.begin(), vn.end(), cmp); vector
    > res; if (vn.empty()) return res; int t = vn[0].x; vector
    tmp; tmp.push_back(vn[0].val); for (size_t i = 1; i < vn.size(); ++i) { if (vn[i].x == t) { tmp.push_back(vn[i].val); } else { res.push_back(tmp); tmp.clear(); t = vn[i].x; tmp.push_back(vn[i].val); } } res.push_back(tmp); return res;}

    代码解释

  • 结构体定义node 结构体用于存储每个结点的X、Y坐标和值。
  • 比较函数:用于排序,先比较X坐标升序,如果X坐标相同,比较Y坐标降序,最后比较值升序。
  • DFS遍历:递归遍历二叉树,记录每个结点的位置和值。
  • 排序:将记录的结点按定义的规则排序。
  • 结果生成:按X坐标分组,生成最终结果列表。
  • 通过这种方法,我们可以有效地实现垂序遍历,并按要求返回结点值列表。

    转载地址:http://lxki.baihongyu.com/

    你可能感兴趣的文章
    OpenDaylight融合OpenStack架构分析
    查看>>
    OpenERP ORM 对象方法列表
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>
    OpenFeign 入门与实战
    查看>>
    OpenFeign源码学习
    查看>>
    OpenFeign组件声明式服务调用
    查看>>
    openfeign远程调用不起作用解决_使用Spring Boot的spring.factories进行注入---SpringCloud Alibaba_若依微服务框架改造---工作笔记007
    查看>>
    openfire开发(四)消息拦截器
    查看>>
    openfire源码解读之将cache和session对象移入redis以提升性能
    查看>>
    Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)
    查看>>
    OpenForest 开源项目安装与使用指南
    查看>>
    OpenGL glBlendFunc() 设置颜色混合 透明度叠加计算
    查看>>
    opengl 深度详解,多重采样时,如何在OpenGL纹理中解析深度值?
    查看>>
    OpenGL 的内置矩阵种种
    查看>>
    OpenGL/OpenGL ES 入门:基础变换 - 初识向量/矩阵
    查看>>
    OpenGL中shader读取实现
    查看>>
    OpenGL中旋转平移缩放等变换的顺序对模型的影响
    查看>>