题目描述
Leetcode 314
给定一个二叉树,将垂直位置上同一列的所有节点整合成一个集合,并按照列的左右位置从左到右返回所有集合,同一列的集合中元素顺序保证,从上到下,从左到右。如果两个节点同行同列,按照从左到右依次返回。
题目思路
首先我们需要给每一个节点加入一个列的属性,我们把root作为column=0 root左边的节点列数为负数,root右边的节点列数为正,通过BFS遍历所有节点,每一次加入新节点进队列时,计算他所在列的值。然后每一次出队列进行处理时把该节点插入对应hashmap中,最后根据column值从小到大把每一个集合加入最后结果。
代码如下
这里使用有序hashmap保存每一列对应集合
class Solution {
public:
vector<vector<int>> verticalOrder(TreeNode* root) {
vector<vector<int>> res;
if (!root) return res;
// 保存每一个col对应的节点值,从上到下,从左到右顺序
map<int, vector<int>> mp;
// BFS逐层遍历每层从左到右遍历,所以如果相同row,col一定左比右靠前
queue<pair<TreeNode*, int>> q;
q.push({root, 0});
while(!q.empty()) {
//遍历
auto cur = q.front(); q.pop();
int col = cur.second;
mp[col].push_back(cur.first->val);
if (cur.first->left) q.push({cur.first->left, col-1});
if (cur.first->right) q.push({cur.first->right, col+1});
}
// 遍历map
for (auto &[k, v] : mp) res.push_back(move(v)); // move操作是将map中v移动到res中然后删除map中v
return res;
}
};
时间复杂度:
O
(
K
l
o
g
K
+
N
)
\mathcal{O}(KlogK + N)
O(KlogK+N) - K代表列数,每一次插入有序map LogK,一共插入K次,后一项是加上BFS遍历所有节点N的时间
空间复杂度:
O
(
N
)
\mathcal{O}(N)
O(N) - 队列中的节点 + 有序hashmap的空间