思路: dfs+哈希表,首先dfs搜索二叉树,将结点值和父节点关系存入哈希表中,然后从target位置开始dfs,分三步,向左孩子结点搜索,向右孩子结点搜索,向上搜索,将距离等于k的值放入list集合 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer,TreeNode> map = new HashMap();
List<Integer> ans = new ArrayList();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
findNode(root);
findAns(target,null,k,0);
return ans;
}
private void findNode(TreeNode root){
if(root.left!=null){
map.put(root.left.val,root);
findNode(root.left);
}
if(root.right!=null){
map.put(root.right.val,root);
findNode(root.right);
}
}
private void findAns(TreeNode root,TreeNode from,int k,int count){
if(root==null)
return;
if(count==k){
ans.add(root.val);
return;
}
if(root.left!=from){//向下找左孩子
findAns(root.left,root,k,count+1);
}
if(root.right!=from){//向下找右孩子
findAns(root.right,root,k,count+1);
}
if(map.get(root.val)!=from){//向上找
findAns(map.get(root.val),root,k,count+1);
}
}
}