2019-11-22
2019-11-22 本文已影响0人
NeverFade
Leetcode 863 二叉树中相距目标K的所有点
看了一些答案,基本都用图来做,先dfs遍历生成图,再bfs遍历求解。但是发现了网上一个更好的答案,此答案也与我最开始的直觉有相似之处,让我大开眼界。
基本的思路是,用dfs求出root到target的路径上每个点到target的距离(这里解释怎么用dfs:若当前节点空,返回-1;若当前节点为target,返回0;否则递归调用左右节点,求出左右节点到target的距离,若结果len>=0,就返回len+1,还要记得把路径上的点用哈希表存起来),然后带着距离遍历二叉树时,每次递归调用dis+1,若当前节点在哈希表中出现,则更新其距离(这样target之前的点到target的距离都能通过哈希表转化成它与target的距离),至于target之后的点,则是dfs的平凡结果。以上便是本题的总结。
class Solution {
public:
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
tar = target->val;
k = K;
find_path(root);
dfs(root, 0);
return res;
}
int tar;
unordered_map<int,int> hmap;
vector<int> res;
int k;
int find_path(TreeNode* root){
if(!root) return -1;
if(root->val==tar){
hmap[tar]=0;
return 0;
}
int left = find_path(root->left);
if(left>=0){
hmap[root->val]=left+1;
return left+1;
}
int right = find_path(root->right);
if(right>=0){
hmap[root->val]=right+1;
return right+1;
}
return -1;
}
void dfs(TreeNode* root, int dis){
if(!root) return;
if(hmap.count(root->val)) dis=hmap[root->val];
if(dis==k) res.push_back(root->val);
dfs(root->left, dis+1);
dfs(root->right, dis+1);
}
};