LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
在解题之前,设想一下如果在相同的场景,二叉树的指针为双向的,即变成了图,寻找离target距离为k的点,这不有手就行?直接DFS完事,回到当前场景,既然要变成图,只需要让每个节点即可以访问左右子节点,又可以访问根节点,接着带入DFS就可以得出结果了,那么如何构建通往根的道路呢?解题步骤如下:
- 构建父节点的连接的函数,即对每个左右子节点,通过map的映射将val与父节点连接;
- 构建dfs函数,包括空值判断,是否到达深度,向左、向右、向父节点三个方向的遍历;
- 主函数先构建父节点连接,再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 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列