我写了一下,大体的逻辑是对的,但是要学会利用结构,而不是硬写,逻辑本来很简单,但也让你搞得很复杂!
这题得思路是,这就相当于一个单向的,不能访问父亲节点,所以我必须用一个map来记录所有的父亲节点,而我只是单纯的把只关于target的节点的一条路径的父亲节点给记录下来,这样也让我写的更加复杂,
而接下来的找的过程,也就是根据K的长度,递归K的深度,如果不为空,则record,关于父亲节点的递归,需要记录其这个节点是已访问的,就不能在访问了,就要递归它的另一个孩子,所以还需要一个容器来记录该节点是否已访问!!
一条路径上的父亲节点也可以这样根据K的深度进行递归!
下面的这个算法的描述是看了别人的解法思路写的。
class Solution {
public:
std::vector<int> result;
std::map< TreeNode*, TreeNode*> par_chil;
std::set<TreeNode*> visitied;
//利用层次遍历,其实也就是广度搜索,找到所有的父亲
void find_parent(TreeNode* root)
{
if (!root) return;
if (root->left)
{
par_chil[root->left] = root;
find_parent(root->left);
}
if (root->right)
{
par_chil[root->right] = root;
find_parent(root->right);
}
}
void dfs(TreeNode* root, int curr_i)
{
if (!root) return; //递归基
if (curr_i==0) {
result.emplace_back(root->val);
return;
}
visitied.insert(root);
if (root->left&&(visitied.find(root->left)==visitied.end())) dfs(root->left, curr_i - 1);
if (root->right && (visitied.find(root->right) == visitied.end())) dfs(root->right, curr_i - 1);
TreeNode* parent = par_chil[root];
if(parent&&visitied.find(parent) == visitied.end()) dfs(parent, curr_i - 1);
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
find_parent(root);
dfs(target, K);
return result;
}
};