【力扣】863. 二叉树中所有距离为 K 的结点
863. 二叉树中所有距离为 K 的结点
28
难度:中等
https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/
题目
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 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
注意,输入的 "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;
}
};
你每日一题了吗?
来分享你的方法吧!
编辑:龚卓然
审核:王泽坤