Juice's blogs

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);
    }
    
};
上一篇下一篇

猜你喜欢

热点阅读