(LeetCode 863) 二叉树中所有距离为 K 的结点 [DFS + 添加父节点信息]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/STILLxjy/article/details/85284530

863. 二叉树中所有距离为 K 的结点
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

输出:[7,4,1]
在这里插入图片描述
注意,输入的 “root” 和 “target” 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。

提示:

1:给定的树是非空的,且最多有 K 个结点。
2:树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
3:目标结点 target 是树上的结点。
4:0 <= K <= 1000.

分析:
由于题目中的树是使用指针构建的,对于每个节点,我们可以很方便的获得子节点的信息,但是无法直接获得父节点的信息。
在搜索距离某个节点target距离为K的所有节点时,我们不仅需要往子节点的方向上搜索,还要往父节点的方向上搜索,所以:
(1)首先进行DFS,获取每个节点的父节点的信息,存在一个father数组中。这好比对于每个节点,我们添加了一条通往父节点的边。
(2)再进行一次DFS(或BFS),查找所有距离target为K的节点信息。
每次可以往 1: 左子节点 2:右子节点 3:父节点 这3个方向进行搜索。
为了避免重复搜索,使用 f 数组对已经查找过的节点进行标记。

AC代码:

/**
 * 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 {
public:
    TreeNode * father[510];
    int f[510];
    
    void getFather(TreeNode* current)
    {
        if(current->left != NULL)
        {
            father[current->left->val] = current;
            getFather(current->left);
        }
        if(current->right != NULL)
        {
            father[current->right->val] = current;
            getFather(current->right);
        }
    }
    
    void getAns(TreeNode* c, int d, int k, vector<int>& ans)
    {
        if(d == k)
        {
            ans.push_back(c->val);
            return;
        }
        if(c->left != NULL && f[c->left->val] == 0)
        {
            f[c->left->val] = 1;
            getAns(c->left,d+1,k,ans);
        }
        if(c->right != NULL && f[c->right->val] == 0)
        {
            
            f[c->right->val]  = 1;
            getAns(c->right,d+1,k,ans);
        }
        if(father[c->val] != NULL && f[father[c->val]->val] == 0)
        {
            f[father[c->val]->val] = 1;
            getAns(father[c->val],d+1,k,ans);
        }
    }
        
    vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
        vector<int> ans;
        memset(father,NULL,sizeof(father));
        getFather(root);
        memset(f,0,sizeof(f));
        f[target->val] = 1;
        getAns(target,0,K,ans);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/STILLxjy/article/details/85284530