2019-11-22

作者: NeverFade | 来源:发表于2019-11-22 21:37 被阅读0次

    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);
        }
        
    };
    

    相关文章

      网友评论

        本文标题:2019-11-22

        本文链接:https://www.haomeiwen.com/subject/vufcwctx.html