zoukankan      html  css  js  c++  java
  • Leetcode 863. 二叉树中所有距离为 K 的结点

    863. 二叉树中所有距离为 K 的结点

     
     
    • 用户通过次数39
    • 用户尝试次数59
    • 通过次数39
    • 提交次数174
    • 题目难度Medium

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

    返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

    示例 1:

    输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
    
    输出:[7,4,1]
    
    解释:
    所求结点为与目标结点(值为 5)距离为 2 的结点,
    值分别为 7,4,以及 1
    
    
    注意,输入的 "root" 和 "target" 实际上是树上的结点。
    上面的输入仅仅是对这些对象进行了序列化描述。
    

    提示:

    1. 给定的树是非空的,且最多有 K 个结点。
    2. 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
    3. 目标结点 target 是树上的结点。
    4. 0 <= K <= 1000.
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        map<TreeNode*,TreeNode*> mp;
        void findparent(TreeNode* root){
            if(root == NULL)return;
            if(root->left){
                mp[root->left] = root;
                findparent(root->left);
            }
            if(root->right){
                mp[root->right] = root;
                findparent(root->right);
            }
            return;
        }
        
        void dfs(TreeNode* target,int k,set<TreeNode*> vis,vector<int>& res){
            if(vis.find(target)!=vis.end()) return;//visit.end()表示集合中没有找到
            vis.insert(target);
            if(k == 0){res.push_back(target->val);return;}
            if(target->left) dfs(target->left,k-1,vis,res);
            if(target->right) dfs(target->right,k-1,vis,res);
            TreeNode* p = mp[target];
            if(p) dfs(p,k-1,vis,res);
        }
        vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
            if(root == NULL) return{};
            findparent(root);
            vector<int> res;
            set<TreeNode*> vis;
            dfs(target,K,vis,res);
            return res;
        }
    };

    __学习了set用法,用map保存根节点。

  • 相关阅读:
    HDU 3951 (博弈) Coin Game
    HDU 3863 (博弈) No Gambling
    HDU 3544 (不平等博弈) Alice's Game
    POJ 3225 (线段树 区间更新) Help with Intervals
    POJ 2528 (线段树 离散化) Mayor's posters
    POJ 3468 (线段树 区间增减) A Simple Problem with Integers
    HDU 1698 (线段树 区间更新) Just a Hook
    POJ (线段树) Who Gets the Most Candies?
    POJ 2828 (线段树 单点更新) Buy Tickets
    HDU 2795 (线段树 单点更新) Billboard
  • 原文地址:https://www.cnblogs.com/cunyusup/p/10599283.html
Copyright © 2011-2022 走看看