思路
广度
优先遍历- 根结点入队,计算其左右孩子
列坐标
,进行答案压入[col]={depth,val}
- 对答案进行
先depth排序 后val排序
代码
class Solution {
public:
vector<vector<int>> verticalTraversal(TreeNode* root) {
if (root == NULL)
return {{}};
map<int, vector<pair<int, int>>> mym;
queue<pair<TreeNode*, int>> myq;
myq.push(make_pair(root, 0));
int depth = 0;
while (!myq.empty()){
int cnt = myq.size();
while (cnt--) {
auto &cur = myq.front();
mym[cur.second].push_back(make_pair(depth, cur.first -> val));
if ((cur.first) -> left)
myq.push(make_pair((cur.first) -> left, cur.second - 1));
if ((cur.first) -> right)
myq.push(make_pair((cur.first) -> right, cur.second + 1));
myq.pop();
}
++depth;
}
vector<vector<int>> res(mym.size());
int index = 0;
for (auto& [k, vec] : mym){
res[index].resize(vec.size());
sort(vec.begin(), vec.end(), [](const pair<int, int>& a, const pair<int, int>& b){
if (a.first == b.first)
return a.second < b.second;
return a.first < b.first;
});
for (int i = 0; i < vec.size(); ++i)
res[index][i] = vec[i].second;
++index;
}
return res;
}
};