给定一个二叉树(具有根结点?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" 实际上是树上的结点。 上面的输入仅仅是对这些对象进行了序列化描述。 ?
提示:
给定的树是非空的。 树上的每个结点都具有唯一的值?0 <= node.val <= 500?。 目标结点?target?是树上的结点。 0 <= K <= 1000.
关键点有两点:
(1)遍历一次记录每个节点的父节点。
(2)深度优先搜索的时候,记录来源节点,防止重复递归。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
vector<int> res;
mp[root] = NULL;
SetParent(root);
deepSearch(target, NULL, k, res);
return res;
}
void SetParent(TreeNode* root) {
if (root == NULL) {
return;
}
if (root->left) {
mp[root->left] = root;
SetParent(root->left);
}
if (root->right) {
mp[root->right] = root;
SetParent(root->right);
}
}
void deepSearch(TreeNode* target, TreeNode* from, int k, vector<int>& res) {
if (target == NULL) {
return;
}
if (k == 0) {
res.push_back(target->val);
return;
}
if (target->left && target->left != from) {
deepSearch(target->left, target, k - 1, res);
}
if (target->right && target->right != from) {
deepSearch(target->right, target, k - 1, res);
}
if (mp[target] != from) {
deepSearch(mp[target], target, k - 1, res);
}
}
private:
unordered_map<TreeNode*, TreeNode*> mp; /*key作为子节点, val作为父节点 */
};
|