Leetcode 863--二叉树中所有距离为 K 的结点
Posted jundima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 863--二叉树中所有距离为 K 的结点相关的知识,希望对你有一定的参考价值。
首先找到每个节点的父节点,利用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;
}
};
以上是关于Leetcode 863--二叉树中所有距离为 K 的结点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 863. 二叉树中所有距离为 K 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列