LeetCode 863. 二叉树中所有距离为 K 的结点
题目链接
题目思想
一开始把这个题当做树的类型来做,结果是毫无思路。只好将树转成图,然后再从target
出发,dfs
寻找距离等于k
的点。
因为树中的数值不是固定的,我们使用HashMap
来存放邻接链表(为了省空间)。
利用一个方法,通过前序遍历的思路建立图,注意我们这个图应该是一个无向图。
在建立完邻接链表后,我们需要做的就是从target
出发,去深搜距离等于k
的点即可。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
HashMap<Integer, List<Integer>> map = new HashMap<>();
List<Integer> res = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
buildGraph(root);
find(target.val, K);
return res;
}
public void buildGraph(TreeNode root){
if(root == null){
return;
}
if(!map.containsKey(root.val)){
map.put(root.val, new ArrayList<>());
}
if(root.left != null){
map.get(root.val).add(root.left.val);
map.put(root.left.val, new ArrayList<>());
map.get(root.left.val).add(root.val);
}
if(root.right != null){
map.get(root.val).add(root.right.val);
map.put(root.right.val, new ArrayList<>());
map.get(root.right.val).add(root.val);
}
buildGraph(root.left);
buildGraph(root.right);
}
public void find(Integer start, int k){
if(set.contains(start)){
return;
}
if(k == 0){
res.add(start);
return;
}
List<Integer> list = map.get(start);
set.add(start);
for(int i = 0; i < list.size(); i++){
find(list.get(i), k - 1);
}
}
}
总结
有时候做题不要那么死板。。