[M二叉树] lc863. 二叉树中所有距离为 K 的结点(dfs+二叉树建无向图)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M二叉树] lc863. 二叉树中所有距离为 K 的结点(dfs+二叉树建无向图)相关的知识,希望对你有一定的参考价值。
1. 题目来源
2. 题目解析
不知道有没有什么树上的简单方法,指的是从 root
节点出发,先找到 target
的层数,然后和 k
计算下在另一边找个高度差值即可。但是写起来有点麻烦,应该可以实现。
暴力思路:
- 直接将树建成无向图,用邻接表存储相邻点。
- 从
target
开始为根,向下dfs
k 层就行了,注意记录上个节点,不要重复遍历。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
代码:
将树建立成无向图即可。
/**
* 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:
vector<int> res;
unordered_map<TreeNode*, vector<TreeNode*>> g;
void dfs1(TreeNode* root) {
if (!root) return ;
if (root->left) {
g[root].push_back(root->left);
g[root->left].push_back(root);
dfs1(root->left);
}
if (root->right) {
g[root].push_back(root->right);
g[root->right].push_back(root);
dfs1(root->right);
}
}
void dfs2(TreeNode* root, TreeNode* pre, int k) {
if (!root) return ;
if (!k) {
res.push_back(root->val);
return ;
}
for (auto e : g[root])
if (e != pre)
dfs2(e, root, k - 1);
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
dfs1(root); // 邻接表建无向图
dfs2(target, NULL, k); // 搜索以target为根,父节点为NULL,距离为k的点
return res;
}
};
以上是关于[M二叉树] lc863. 二叉树中所有距离为 K 的结点(dfs+二叉树建无向图)的主要内容,如果未能解决你的问题,请参考以下文章