vlambda博客
学习文章列表

【力扣】863. 二叉树中所有距离为 K 的结点

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

【力扣】863. 二叉树中所有距离为 K 的结点
七月

28

难度:中等

https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/

 


题目




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

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




示例




【力扣】863. 二叉树中所有距离为 K 的结点
【力扣】863. 二叉树中所有距离为 K 的结点

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

输出:[7,4,1]

解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1




【力扣】863. 二叉树中所有距离为 K 的结点



注意,输入的 "root" 和 "target" 实际上是树上的结点。

上面的输入仅仅是对这些对象进行了序列化描述。


 
   
   
 


提示




  • 给定的树是非空的。

  • 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。

  • 目标结点 target 是树上的结点。

  • 0 <= K <= 1000.




题目分析




  • 树仅做序列化描述,也就是给出这些结点的连通关系,可转化为固定路径长度问题。

  • 考虑到每个结点都是唯一的,且结点数不多,用二维数组来表示连通关系。

  • 固定路径长度问题可用广度搜索来解决。




解题




class Solution {public: vector<int> distanceK(TreeNode* root, TreeNode* target, int K) { vector<int> res; if(K==0) {res.push_back(target->val);return res;} vector<vector<int>> MP(501);//二维数组来记录结点的连通关系 queue<TreeNode*> Q; Q.push(root); while(!Q.empty()){ TreeNode* T = Q.front(); if(T->left!=NULL) { MP[T->val].push_back(T->left->val); MP[T->left->val].push_back(T->val); Q.push(T->left); } if(T->right!=NULL) { MP[T->val].push_back(T->right->val); MP[T->right->val].push_back(T->val); Q.push(T->right); } Q.pop(); }
vector<int> mp(501); queue<int> QQ; QQ.push(target->val); int last_K = 1; mp[target->val] = -1; //广搜 for(int i = 1; i <= K; i++){ int next_K = 0; while(last_K>0){ last_K--; int o_K = QQ.front();QQ.pop(); for(auto x : MP[o_K]){ if(mp[x]==0) {mp[x] = i;QQ.push(x);next_K++;} } } last_K = next_K; } while(!QQ.empty()){ res.push_back(QQ.front()); QQ.pop(); } return res; }};


你每日一题了吗?

来分享你的方法吧!

编辑:龚卓然     

审核:王泽坤