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