LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路:
在解题之前,设想一下如果在相同的场景,二叉树的指针为双向的,即变成了图,寻找离target距离为k的点,这不有手就行?直接DFS完事,回到当前场景,既然要变成图,只需要让每个节点即可以访问左右子节点,又可以访问根节点,接着带入DFS就可以得出结果了,那么如何构建通往根的道路呢?解题步骤如下:

  1. 构建父节点的连接的函数,即对每个左右子节点,通过map的映射将val与父节点连接;
  2. 构建dfs函数,包括空值判断,是否到达深度,向左、向右、向父节点三个方向的遍历;
  3. 主函数先构建父节点连接,再dfs遍历。

代码如下:

/**
 * 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:
    unordered_map<int, TreeNode*> parents;
    vector<int> ans;

public:
    vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
        // 构建父母节点的连接
        findParents(root);
        // 深度遍历
        dfs(target, nullptr, k);
        return ans;
    }

    void findParents(TreeNode* node) {
        // 左节点不为空
        if(node -> left != nullptr) {
            parents[node -> left -> val] = node;
            findParents(node -> left);
        }
        // 右节点不为空
        if(node -> right != nullptr) {
            parents[node -> right -> val] = node;
            findParents(node -> right);
        }
    }

    void dfs(TreeNode* node, TreeNode* from, int k) {
        // 节点为空
        if(node == nullptr) {
            return;
        }
        // 如果到达了次数
        if(k == 0) {
            ans.push_back(node -> val);
            return;
        }
        // 向左子树走
        if(node -> left != from) {
            dfs(node -> left, node, k - 1);
        }
        // 向右走
        if(node -> right != from) {
            dfs(node -> right, node,  k - 1);
        }
        // 向上走
        if(parents[node -> val] != from) {
            dfs(parents[node -> val], node,  k - 1);
        }
    }
};

以上是关于LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等863二叉树中所有距离为 K 的结点

力扣863. 二叉树中所有距离为 K 的结点

LeetCode 863. 二叉树中所有距离为 K 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列

LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路

863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点