题目:We are given a binary tree (with root node root), a target node, and an integer value K.
Return a list of the values of all nodes that have a distance K from the target node. The answer can be returned in any order.
解题思路:借鉴于https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/solution/
构造一个队列,把所有跟target距离相同的点用null分隔开,类似于树的广度优先搜索。
代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
Map<TreeNode,TreeNode> parent = new HashMap<>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
findParent(root,null);
//quene中每两个null之间的节点距target距离一样
Queue<TreeNode> queue = new LinkedList<>();
queue.add(null);
queue.add(target);
//visited存放已经遍历过的节点
Set<TreeNode> visited = new HashSet<>();
visited.add(null);
visited.add(target);
int dist = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node == null) {
//当node等于null时此时队列中的所有节点跟target距离相同
if (dist == K) { //如果此时就是距离为k的时候直接输出
ArrayList<Integer> ans = new ArrayList<>();
while (!queue.isEmpty()) ans.add(queue.poll().val);
return ans;
} else { //否则,再引入一个null,dist++代表这个null后面的节点跟k的距离
queue.offer(null);
dist++;
}
} else {
//如果此时的是一个节点,那么我们引入他的子孙和父节点,使新引入的节点到k的距离
//比他到k的距离大一,而且这些节点会以null为分界线
if (!visited.contains(node.left)) {
queue.offer(node.left);
visited.add(node.left);
}
if (!visited.contains(node.right)) {
queue.offer(node.right);
visited.add(node.right);
}
if (!visited.contains(parent.get(node))) {
queue.offer(parent.get(node));
visited.add(parent.get(node));
}
}
}
return new ArrayList<>();
}
public void findParent(TreeNode node,TreeNode par){
if(node == null)return;
parent.put(node,par);
findParent(node.left,node);
findParent(node.right,node);
}