vlambda博客
学习文章列表

【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);

}}