题目解析

题目意思很简单,就是给你一个二叉树,然后告诉你每个节点都是有位置信息的,即每个节点可以用(x,y)来表示。然后节点位置信息为(x,y)的节点的左节点位置为(x+1,y-1),右节点位置为(x+1,y+1)。并且根节点的位置信息统一为(0,0)

现在你需要像扫描表格一样,从上往下,从左往右的顺序遍历。

解题思路

要求的顺序是从上往下,从左往右,并且如果位置相同,就按节点值从小到大排。那么能决定顺序的就是两个信息,一个是节点的坐标信息,一个是节点的值信息。显然是需要对一个pair<坐标,节点值>进行排序。其中坐标可以用一个point(x,y)来表示。

排序规则

pair类型有一个默认排序规则,就是先比较first,如果first相等,则再比较second。

正好符合"如果位置相同,就按节点值从小到大排"的约定

point的比较,需要满足“从上往下,从左往右”的约定

所以应该是先比较point.y,然后再比较point.x

算法实现

  1. 将二叉树转换成vector<pair<point,int>>
  2. 将上一步产生的容器排序
  3. 合并同一列的值组合成vector<vector<int>>
  4. 返回结果

代码

class point
{
public:
int x;
int y;
point(int _x, int _y) :x(_x), y(_y) {};
};
bool operator<(const point& left,const point& right)
{
return (left.y < right.y) || (left.y == right.y) && (left.x < right.x);
}
bool operator==(const point& left, const point& right)
{
return (left.x == right.x && left.y == right.y);
}
ostream& operator<<(ostream& output, const point& p) // 打印输出,以便查看
{
output << "(" << p.x << "," << p.y << ")";
return output;
}
bool PairCompare(const pair<point, int>& left, const pair<point, int>& right)
{
return (left.first < right.first) || ((left.first == right.first) && (left.second < right.second));
} class Solution {
vector<pair<point, int>> vec;
void bfs(TreeNode* node, point p)
{
if (!node)
return;
bfs(node->left, point(p.x + 1, p.y - 1));
vec.push_back(make_pair(p, node->val));
bfs(node->right, point(p.x + 1, p.y + 1));
}
public:
vector<vector<int>> verticalTraversal(TreeNode* root) {
vector<vector<int>> ans;
if (!root)
return ans;
bfs(root, point(0, 0));
sort(vec.begin(), vec.end(), PairCompare);
/* 输出排序结果
for (auto x : vec)
{
cout << "point: " << x.first;
cout << "val: " << x.second << endl;
}
*/
auto prePair = vec.begin();
vector<int> tmpVec;
tmpVec.push_back(prePair->second);
for (auto it = vec.begin() + 1; it != vec.end(); ++it)
{
if (it->first.y == prePair->first.y)
{
tmpVec.push_back(it->second);
}
else
{
ans.push_back(tmpVec);
tmpVec.clear();
tmpVec.push_back(it->second);
prePair = it;
}
}
ans.push_back(tmpVec);
return ans;
}
};

结果

leetcode 987 二叉树的垂序遍历的更多相关文章

  1. LeetCode:二叉树的后序遍历【145】

    LeetCode:二叉树的后序遍历[145] 题目描述 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很 ...

  2. [Swift]LeetCode987. 二叉树的垂序遍历 | Vertical Order Traversal of a Binary Tree

    Given a binary tree, return the vertical order traversal of its nodes values. For each node at posit ...

  3. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...

  4. LeetCode 145. 二叉树的后序遍历(Binary Tree Postorder Traversal)

    145. 二叉树的后序遍历 145. Binary Tree Postorder Traversal 题目描述 给定一个二叉树,返回它的 后序 遍历. LeetCode145. Binary Tree ...

  5. Java实现 LeetCode 145 二叉树的后序遍历

    145. 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成 ...

  6. Java实现 LeetCode 94 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...

  7. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1 ...

  8. Leetcode 94. 二叉树的中序遍历

    1.问题描述 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法一 ...

  9. 【leetcode 145. 二叉树的后序遍历】解题报告

    前往二叉树的:前序,中序,后序 遍历算法 方法一:递归 vector<int> res; vector<int> postorderTraversal(TreeNode* ro ...

随机推荐

  1. itools安装程序无法创建临时文件夹

    做个记录: itools链接ios设备后,安装程序包时提示:无法创建临时文件夹 主要原因可能有以下几点 1.手机储存空间不足. 2.驱动组建被删除了,重启管理软件会自动跟新驱动. 解决办法:1.清除空 ...

  2. MySQL 全文索引实现一个简单版搜索引擎

    前言 只有Innodb和myisam存储引擎能用全文索引(innodb支持全文索引是从mysql5.6开始的) char.varchar.text类型字段能创建全文索引(fulltext index ...

  3. 代码生成器:IDEA 强大的 Live Templates

    前言 Java 开发过程经常需要编写有固定格式的代码,例如说声明一个私有变量,logger或者bean等等.对于这种小范围的代码生成,我们可以利用 IDEA 提供的 Live Templates功能. ...

  4. 【题解】Luogu p2016 战略游戏 (最小点覆盖)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  5. Spring Boot下的一种导出Excel文件的代码框架

    1.前言 ​ 在Spring Boot项目中,将数据导出成Excel格式文件是常见的功能.与Excel文件导入类似,此处也用代码框架式的方式实现Excel文件导出,使得代码具有可重用性,并保持导出数据 ...

  6. c#创建windows服务(创建,安装,删除)

    一.在vs中创建一个window服务 二.进入Service1.cs页面后 右击----创建安装程序,安装程序创建成功后---会出现ProjectInstaller.cs文件 三.进入ProjectI ...

  7. .NET网页后台调用前台js方法时相同Key,调用不成功

    ClientScript.RegisterStartupScript(GetType(), "key", "<script>Save()</script ...

  8. 如何在微信小程序中使用组件?

    何为组件 组件封装一段代码,不仅可以在其他的页面中可以使用,也可以在本页面中使用,不用再重复造"轮子".组件可以提高代码的复用率,因此善于使用组件在微信小程序开发中是非常重要的. ...

  9. 实例化Class类的5种方法

    实例说明 java的数据类型分为两类:基础数据类型和引用数据类型.对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象.它提供了在运行时检查对象属性的方法,这些属性包括 ...

  10. CRM系统不仅给企业带来更多收益而且提升销售效率

    将客户信息记录在CRM系统的数据库中,同时共享沟通数据给售前.售后.SDR等上下游,客户资源还能够按照分配规则分配给适合的销售人员,帮助更快成单.全面使用CRM系统会给企业带来更多业绩. 1.全方位客 ...