问题描述
解题报告
存储每个节点的父节点,然后以 t a r g e t target target 为中心,从三个方向进行遍历【父节点、左节点、右节点】。
实现代码
//存储每个节点的父节点
class Solution{
public:
map<TreeNode*, TreeNode*>par;
void findParent(TreeNode* root){
if(!root) return;
if(root->left){
par[root->left]=root;
findParent(root->left);
}
if(root->right){
par[root->right]=root;
findParent(root->right);
}
}
//从三个方向进行遍历,注意边界条件
void dfs(TreeNode* root, int k, set<TreeNode*> &visited,vector<int>& res){
//在已访问过的元素中找到了root,这条路上的递归结束
if(visited.find(root)!=visited.end())
return;
visited.insert(root);
if(k==0){
res.push_back(root->val);
return;
}
if(root->left)
dfs(root->left,k-1,visited,res);
if(root->right)
dfs(root->right,k-1,visited,res);
TreeNode* p=par[root];
if(p)
dfs(p,k-1,visited,res);
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int K){
if(!root)
return {};
findParent(root);
vector<int>res;
set<TreeNode*>visited;
dfs(target,K,visited,res);
return res;
}
};