思路——深度遍历+广度遍历
- 建立结点的父亲索引——通过递归实现
- 从target出发,进行广度搜索查找depth为K的所有结点
- 需要建立访问记录,防止死循环(因为遍历会向上也会向下走)
代码
步骤:
1. 建立父亲索引
2. 将target放入队列
3. 对target左右孩子、父亲结点进行广度搜索
4. 找到depth 进行队列全弹出
5. 输出答案
class Solution {
private:
unordered_map<TreeNode*, TreeNode*> node2parent;
void dfs(TreeNode* curr, TreeNode* parent){
if (curr != nullptr){
node2parent[curr] = parent;
dfs(curr->left, curr);
dfs(curr->right, curr);
}
}
public:
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
dfs(root, nullptr);
queue<TreeNode*> q;
unordered_set<TreeNode*> visited;
q.push(target);
visited.insert(target);
int dist = 0;
while (!q.empty()){
if (dist == K){
vector<int> res;
while (!q.empty()){
res.emplace_back(q.front()->val);
q.pop();
}
return res;
}
for (int i = q.size(); i > 0; --i){
TreeNode* curr = q.front();q.pop();
if (curr->left != nullptr && visited.find(curr->left) == visited.end()){
q.push(curr->left);
visited.insert(curr->left);
}
if (curr->right != nullptr && visited.find(curr->right) == visited.end()){
q.push(curr->right);
visited.insert(curr->right);
}
TreeNode* parent = node2parent[curr];
if (parent!=nullptr && visited.find(parent) == visited.end()) {
q.push(parent);
visited.insert(parent);
}
}
++dist;
}
return {};
}
};