文章目录
- 1. 题目
- 2. 解题
- 2.1 DFS
- 2.2 BFS
1. 题目
给定一个二叉树,返回其结点 垂直方向(从上到下,逐列)遍历的值。
如果两个结点在同一行和列,那么顺序则为 从左到右。
示例 1:
输入: [3,9,20,null,null,15,7]3/\/ \
9 20/\/ \15 7 输出:
[[9],[3,15],[20],[7]
]示例 2:
输入: [3,9,8,4,0,1,7]3/\/ \9 8/\ /\/ \ / \
4 0 1 7 输出:
[[4],[9],[3,0,1],[8],[7]
]示例 3:
输入: [3,9,8,4,0,1,7,null,null,null,2,5]
(注意:0 的右侧子节点为 2,1 的左侧子节点为 5)3/\/ \9 8/\ /\/ \/ \4 01 7/\/ \5 2输出:
[[4],[9,5],[3,0,1],[8,2],[7]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-vertical-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 DFS
- 记录深度、横坐标,按横坐标存入map,取出来的时候按深度排序
class Solution {map<int, vector<pair<int,int>>> ans;
public:vector<vector<int>> verticalOrder(TreeNode* root) {dfs(root, 0, 0);vector<vector<int>> res;for(auto& a : ans){ //按横坐标取出sort(a.second.begin(), a.second.end(),[&](auto a, auto b){return a.first < b.first;//按深度排序});vector<int> temp;for(auto& d_val : a.second)temp.push_back(d_val.second);res.push_back(temp);}return res;}void dfs(TreeNode* root, int x, int deep){if(!root) return;ans[x].push_back({deep, root->val});//深度、valdfs(root->left, x-1, deep+1);dfs(root->right, x+1, deep+1);}
};
8 ms 8.7 MB
2.2 BFS
- 只需记录x横坐标,存入map,从顶向下BFS层次遍历(保证从上到下的顺序)
class Solution {
public:vector<vector<int>> verticalOrder(TreeNode* root) {if(!root) return {};vector<vector<int>> res;map<int,vector<int>> m;queue<pair<TreeNode*,int>> q;int size, x, val;TreeNode *cur;q.push({root, 0});while(!q.empty()){size = q.size();while(size--){cur = q.front().first;val = cur->val;x = q.front().second;q.pop();m[x].push_back(val);if(cur->left)q.push({cur->left, x-1});if(cur->right)q.push({cur->right, x+1});}}for(auto& mi : m)res.push_back(mi.second);return res;}
};
8 ms 8.1 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!