【力扣】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;}};
你每日一题了吗?
来分享你的方法吧!
编辑:龚卓然
审核:王泽坤
