解题思路:
- 本题是寻找离木标结点相距k的所有结点,这里不但右子树结点还可能存在父亲等其他结点,因为树是一种递归结构不会存储父节点,所以先DFS遍历存储每一个结点的父节点,然后再DFS进行满足田间的搜索
- 注意:
1.满足条件搜索时避免发生重复搜索,要加入一个from结点,该节点递归的前一个结点
/**
* 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:
// 记录每一个结点的父节点,因为每一个结点的值都不同所以可以用val作为Key
unordered_map<int,TreeNode*>mymap;
// 存储结果
vector<int>ans;
public:
// DFS遍历存储
void findParents(TreeNode* root){
if(root==nullptr)return;
if(root->left != nullptr){
mymap[root->left->val] = root;
findParents(root->left);
}
if(root->right != nullptr){
mymap[root->right->val] = root;
findParents(root->right);
}
}
// 从 target 出发 DFS,寻找所有深度为 k 的结点,from是为了防止重复查找
void findAns(TreeNode* root,TreeNode* from,int depth,int k){
if(root == nullptr)return;
if(depth == k){
ans.push_back(root->val);
return;
}
// 左节点递归
// root->left!=from防止在父节点递归时重复计算到之前遍历的结点
if(root->left!=nullptr && root->left!=from){
findAns(root->left,root,depth+1,k);
}
// 右结点递归
// root->left!=from防止在父节点递归时重复计算到之前遍历的结点
if(root->right != nullptr && root->right != from){
findAns(root->right,root,depth+1,k);
}
// 父节点递归
// mymap[root->val]!=from防止子节点访问父节点
if(mymap[root->val]!=nullptr && mymap[root->val]!=from){
findAns(mymap[root->val],root,depth+1,k);
}
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
// 从 root 出发 DFS,记录每个结点的父结点
findParents(root);
// 从 target 出发 DFS,寻找所有深度为 k 的结点
findAns(target, nullptr, 0, k);
return ans;
}
};