bfs O(n) time 给每个node一个伪下标并维护最小最大下标,最后利用最小下标来还原真实下标
必须自顶向下自左向右 dfs如果不维护行号会违反 bfs完美符合不用维护行号只需要把每个数放到对应column即可所以选择bfs 即排序优先级是左右上下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
class Solution { public: vector<vector<int>> verticalOrder(TreeNode* root) { if (!root) return {}; vector<pair<int, TreeNode *>> v; queue<pair<int, TreeNode *>> q; q.emplace(0, root); int mn = INT_MAX, mx = INT_MIN; while (!q.empty()) { auto [idx, x] = q.front(); q.pop(); v.emplace_back(idx, x); mn = min(mn, idx); mx = max(mx, idx); if (x->left) { q.emplace(idx - 1, x->left); } if (x->right) { q.emplace(idx + 1, x->right); } } vector<vector<int>> res(mx - mn + 1); for (auto [idx, x] : v) { res[idx - mn].push_back(x->val); } return res; } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
class Solution { public: vector<vector<int>> verticalOrder(TreeNode* root) { if (!root) return {}; unordered_map<int, vector<TreeNode *>> m; queue<pair<int, TreeNode *>> q; q.emplace(0, root); int mn = INT_MAX, mx = INT_MIN; while (!q.empty()) { auto p = q.front(); q.pop(); int idx = p.first; auto x = p.second; m[idx].push_back(x); mn = min(mn, idx); mx = max(mx, idx); if (x->left) { q.emplace(idx - 1, x->left); } if (x->right) { q.emplace(idx + 1, x->right); } } vector<vector<int>> res(mx - mn + 1); for (int i = mn; i <= mx; ++i) { for (auto x : m[i]) { res[i - mn].push_back(x->val); } } return res; } };
|