leetcode314 - Binary Tree Vertical Order Traversal - medium
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]
]
观察发现对于每个node如果它在vertical level k上那它的左子树在level k-1, 右子树k+1.
level order traverse的同时,多记录一栏track vertical order就好。
每个level用map来装,这样输出的时候自动按从左到右排好了。
面经:print the top view of a binary tree
实现:Time O(nlogn) BFS-n, map-logn Space O(n)
class Solution { public: vector<vector<int>> verticalOrder(TreeNode* root) { vector<vector<int>> res; if (!root) return res; map<int, vector<int>> m; queue<pair<TreeNode*, int>> q; q.push({root, 0}); while (!q.empty()){ auto cur = q.front(); q.pop(); m[cur.second].push_back(cur.first->val); if (cur.first->left) q.push({cur.first->left, cur.second-1}); if (cur.first->right) q.push({cur.first->right, cur.second+1}); } for (auto& elem : m) res.push_back(elem.second); return res; } };

浙公网安备 33010602011771号