首先找到每个节点的父节点,利用map存储(map底层用红黑树实现,所以查找效率也高),这种方法客服了二叉树只能找到自己的儿子的缺点。
然后用dfs搜索的方法寻找目标节点。
代码如下:
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){
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;
}
};
原文地址:https://www.cnblogs.com/jundima/p/10176815.html