987. 二叉树的垂序遍历
Posted 没伞的孩子拼命跑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了987. 二叉树的垂序遍历相关的知识,希望对你有一定的参考价值。
题目要求:
题目解析
今天的题目给的标签有点过了,应该给个中等的标签。题目的意思是根节点的位置在(0,0),然后让你竖着从左向右从上到下输出这棵树,输出的过程中同一列的索引如果是相等的话,按照数据值进行排序。这个题猛的一看是在考树的遍历,其实仔细分析一下,就是在考你存储和排序。
解题思路
首先看一下这个题目的数据量,1000个点以内,对相当于没有数据量。然后考虑这个题,是从左到右的一列一列的 输出,所以我们遍历树的时候,要存储下来树的x的索引。又因为如果是y是从上到下的输出,所以我们还要存储y的索引.又因为y的索引相同的时候还要比较数据的大小。因此我们必须建立一个二级的排序结构。所以我们可以使用map<int,vector<pair<int,int>>>mp来进行比较和存储。红色的int存储x索引,绿色的int存储Y,黑丝啊呸,黑色的进行存储数据。排序的时候因为map是自动根据key排序的,所以x的大小肯定是从小到大的,保证了从左到右遍历树,然后再对pair进行排序,根据y从小到大排序,y相等的就根据数据的大小排序。齐活!!!
class Solution {//C++代码
public:
map<int,vector<pair<int,int>>>mp;
void dfs(TreeNode *root, int y,int x)
{
if(root == nullptr)return;
mp[x].push_back({y,root->val});
dfs(root->left,y+1,x-1);
dfs(root->right,y+1,x+1);
}
vector<vector<int>> verticalTraversal(TreeNode* root) {
dfs(root,0,0);
vector<vector<int>>res;
for(auto it : mp)
{
sort(it.second.begin(),it.second.end(),[](pair<int,int> a,pair<int,int> b){
return a.first<b.first||(a.first==b.first&&a.second<b.second);
});
vector<int>temp;
for (auto t : it.second)
{
temp.push_back(t.second);
}
res.push_back(temp);
}
return res;
}
};
通过情况
以上是关于987. 二叉树的垂序遍历的主要内容,如果未能解决你的问题,请参考以下文章