题目描述
Given a binary tree, return the vertical order traversal of its nodes’ values. (ie, from top to bottom, column by column).
If two nodes are in the same row and column, the order should be from left to right.
样例
Examples 1:
Input: [3,9,20,null,null,15,7]
3
/\
/ \
9 20
/\
/ \
15 7
Output:
[
[9],
[3,15],
[20],
[7]
]
Examples 2:
Input: [3,9,8,4,0,1,7]
3
/\
/ \
9 8
/\ /\
/ \/ \
4 01 7
Output:
[
[4],
[9],
[3,0,1],
[8],
[7]
]
Examples 3:
Input: [3,9,8,4,0,1,7,null,null,null,2,5] (0's right child is 2 and 1's left child is 5)
3
/\
/ \
9 8
/\ /\
/ \/ \
4 01 7
/\
/ \
5 2
Output:
[
[4],
[9,5],
[3,0,1],
[8,2],
[7]
]
算法1
BFS + map $O(n)$
每列要求顺序是从上到下的,所以不能用DFS.
用 BFS,root col为0,在child node入队时,记录每个node的 col 号码,用 map : col -> vector<int> 收集 结果。
注意map的key是有序的,不需要再sort。
C++ 代码
vector<vector<int>> verticalOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
map<int, vector<int>> m; // col -> node vals
using TPair = pair<TreeNode*, int>; // node, col
queue<TPair> q;
q.push( { root, 0 });
while(q.size()) {
auto t = q.front(); q.pop();
int col = t.second;
auto node = t.first;
m[col].push_back( node->val );
if(node->left) { q.push({node->left, col-1 }); }
if(node->right) { q.push({node->right, col+1}); }
}
for(auto kv : m) res.push_back(kv.second);
return res;
}