题目链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/
题意:
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
方法:哈希表将二叉树转换为图
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {//树变图
private:
unordered_map<int,TreeNode*> mp;//哈希表,<当前节点的val,父节点>
vector<int> vct;//distanceK中的返回向量
public:
void findParents(TreeNode* node)//寻找父节点,相当于构图,把二叉树转换为图
{
if(node->left!=nullptr)//左子节点不为空的时候
{
mp[node->left->val] = node;//更新哈希表
findParents(node->left);//更新左子节点的对应哈希项
}
if(node->right!=nullptr)//右子节点不为空的时候
{
mp[node->right->val] = node;//更新哈希表
findParents(node->right);//更新右子节点的对应哈希项
}
}
void dfs(TreeNode* node,TreeNode* from,int k)//深度搜索
{
if(node==nullptr)//当节点为空时
{
return ;//结束深搜
}
if(k==0)//当搜索路径达到0时
{
vct.emplace_back(node->val);//说明找到节点,加入返回向量
return ;//结束深搜
}
if(node->left!=from)//向左子树查找
{
dfs(node->left,node,k-1);
}
if(node->right!=from)//向右子树查找
{
dfs(node->right,node,k-1);
}
if(mp[node->val]!=from)//向父节点查找
{
dfs(mp[node->val],node,k-1);
}
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
findParents(root);//更新二叉树为图
dfs(target,nullptr,k);//深搜寻找路径为k的节点
return vct;//返回向量
}
};