Posted onEdited onInLeetCodeDisqus: Symbols count in article: 2.8kReading time ≈3 mins.
O(nlog(n/k)) time O(n) space n是node数 k是column数 也是树的width 插入是O(n) 整理是O(k*(n/k)log(n/k)) = O(nlog(n/k)) 跟314. Binary Tree Vertical Order Traversal的区别是要相同位置的数要按大小排序,所以排序优先级是左右上下大小,因此必须维护行号,理论上bfs和dfs均可,但dfs代码简单
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ classSolution { public: vector<vector<int>> verticalTraversal(TreeNode* root) { dfs(root, 0, 0); vector<vector<int>> res; for (auto &&[k, s] : m) { res.push_back({}); // 对于同一列要按照从上到下的顺序输出,同一位置再按大小输出 for (auto &&[_, v] : s) { res.back().insert(end(res.back()), begin(v), end(v)); } } return res; }
voiddfs(TreeNode *root, int i, int j){ if (!root) return; m[i][j].insert(root->val); dfs(root->left, i - 1, j + 1); // 因为要保证自顶向下的顺序所以这里一定要+1不能-1 dfs(root->right, i + 1, j + 1); }