vlambda博客
学习文章列表

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;
    }
};

通过情况