【DFS】863. 二叉树中所有距离为 K 的结点(中等)
让我们先看看这道题目的描述
这道题目和寻找二叉树层数相差为k的节点很相似,显然可以用递归来实现,但是满足题目的节点也有可能存在于不同的子树上,我们需要先遍历这棵树,记录下来子节点和父节点。
private void saveParents(TreeNode root){
if(root == null) return;
if(root.left != null) {
map.put(root.left, root);
saveParents(root.left);
}
if(root.right != null) {
map.put(root.right, root);
saveParents(root.right);
}
}
接着递归计算满足题目要求的节点,为了避免重复计算,我们需要对设置一个变量去记录该节点是从什么方向过来的。
是从左子节点,右子节点,父节点中的哪一个?
不能去走上一步走过的路
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution{
Map<TreeNode, TreeNode> map = new HashMap<>();
List<Integer> ans = new ArrayList<>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
saveParents(root);
dfs(target, null, 0, k);
return ans;
}
private void saveParents(TreeNode root){
if(root == null) return;
if(root.left != null) {
map.put(root.left, root);
saveParents(root.left);
}
if(root.right != null) {
map.put(root.right, root);
saveParents(root.right);
}
}
private void dfs(TreeNode node, TreeNode from, int step, int k){
if(node == null) return;
if(step == k){
ans.add(node.val);
return;
}
if(node.left != from) dfs(node.left, node, step + 1, k);
if(node.right != from) dfs(node.right, node, step + 1, k);
if(map.get(node) != from) dfs(map.get(node), node, step + 1, k);
}
}