987.二叉树的垂序遍历

987. 二叉树的垂序遍历(https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree/)
给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

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

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

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

分析题意,从根节点开始进行前序/后序/中序遍历,用两个参数dp、idx记录当前层数,列数当进入左子树
idx-1,进入右子树idx+1,利用map,将id相同的节点连同其深度以及值存入vector,最终再对相同idx的节点按照深度以及值排序
得到结果。
AC代码:

class Solution {
public:
    map<int,vector<pair<int,int>>>mp;
    int srh(TreeNode* root,int idx,int dp){
        if(root==nullptr) return 0;
        mp[idx].push_back({root->val,dp});
        srh(root->left,idx-1,dp+1);
        srh(root->right,idx+1,dp+1);
        return 0;
    }
    static bool cmp(pair<int,int> t1,pair<int,int> t2){
        if(t1.second==t2.second) return t1.first<t2.first;
        else return t1.second<t2.second;
    }
    vector<vector<int>> verticalTraversal(TreeNode* root) {
        vector<vector<int>>res;
        vector<int>tmp;
        srh(root,0,0);
        for(auto &v:mp) {
            tmp.clear();
            sort(v.second.begin(),v.second.end(),cmp);
            for(auto &p:v.second) tmp.push_back(p.first);
            res.emplace_back(tmp);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值