给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。返回到目标结点 target 距离为 k 的所有结点的值的列表。
思路:用hashmap记录每个节点的父节点,即可把 “树” 转化为 “图” ,从target出发可以dfs到每个节点,不区分向上搜父节点还是向下搜子节点。
为避免在深度优先搜索时重复访问结点,递归时额外传入来源结点 from,比如如果当前结点是由左子树通过map上来的,那当前结点的左边就没必要走了
class Solution {
List<Integer>res=new ArrayList<>();
Map<Integer, TreeNode> parents = new HashMap<Integer, TreeNode>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
// 从 root 出发 DFS,记录每个结点的父结点
findParents(root);
// 从 target 出发 DFS,寻找所有深度为 k 的结点
findAns(target, null, 0, k);
return res;
}
//记录每个结点的父结点
public void findParents(TreeNode root){
if(root.left!=null){
parents.put(root.left.val,root);
findParents(root.left);
}
if(root.right!=null){
parents.put(root.right.val,root);
findParents(root.right);
}
}
//以 target 为“root”,DFS,寻找depth为k的节点
public void findAns(TreeNode root, TreeNode form,int depth,int k){
if(root==null) return;
if(depth==k){
res.add(root.val);
return;
}
if(root.left!=form) findAns(root.left,root,depth+1,k);
if(root.right!=form) findAns(root.right,root,depth+1,k);
if(parents.get(root.val)!=form) findAns(parents.get(root.val),root,depth+1,k);
}
}