Leetcode每日一题:all-nodes-distance-k-in-binary-tree(二叉树中所有距离为K的节点)

在这里插入图片描述
思路:主要就是用DFS做当前节点和父节点的映射,这样就能在target节点BFS的形式处发散出去;其次,为了防止发散过程中重复遍历某个节点,设定set或者map,对里面已存放的节点不加遍历;有时候做题不要想多厉害的方法,踏踏实实的这种反而挺有效!
在这里插入图片描述

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

//parent存放当前节点的父节点
map<TreeNode *, TreeNode *> parent;

//遍历树,把每个节点 <节点,父节点> 存入parent
void dfs(TreeNode *cur, TreeNode *par) 
{
    parent[cur] = par;
    if (cur->left)
        dfs(cur->left, cur);
    if (cur->right)
        dfs(cur->right, cur);
}

vector<int> distanceK(TreeNode *root, TreeNode *target, int K)
{
    vector<int> res;
    if (!root)
    {
        return res;
    }
    if (K == 0)
    {
        res.push_back(target->val);
        return res;
    }

    dfs(root, NULL);

    queue<TreeNode *> q;
    map<TreeNode *, int> mm;//用于存放走 0~K-1步 的中间节点
    mm[target] = 1;
    q.push(target);
    //bfs
    while (!q.empty())
    {
        int len = q.size();
        //如果走到了K步
        if (K == 0)
        {
            while (len--)
            {
                int temp = q.front()->val;
                q.pop();
                res.push_back(temp);
            }
            return res;
        }
        //没走到K步,则被该层节点所能到的所有节点放入队列,mm的作用在这就体现了
        while (len--)
        {
            TreeNode *cur = q.front();
            q.pop();
            if (cur->left && !mm[cur->left])
            {
                q.push(cur->left);
                mm[cur->left] = 1;
            }
            if (cur->right && !mm[cur->right])
            {
                q.push(cur->right);
                mm[cur->right] = 1;
            }
            if (parent[cur] && !mm[parent[cur]])
            {
                q.push(parent[cur]);
                mm[parent[cur]] = 1;
            }
        }
        K--;
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值