一、题目
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
点击查看原题
难度级别: 中等
二、思路
1)哈希表+深度搜索
如果使用递归的方式查找到target
节点上方或旁边距离为k
的节点,逻辑比较复杂
于是使用哈希表建立起来子节点与父节点的映射关系,二叉树就变成了三叉树,只需要以target
节点为root
,进行深度搜索,就可以找到距离k
的所有节点(tips:记录一下遍历过来的上一个节点,防止重复遍历)
三、代码
1)哈希表+深度搜索
class Solution {
Map<TreeNode, TreeNode> map;
List<Integer> ans;
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
ans = new ArrayList();
map = new HashMap();
findParents(root);
findChildren(target, null, k);
return ans;
}
private void findParents(TreeNode root) {
if (root.left != null) {
map.put(root.left, root);
findParents(root.left);
}
if (root.right != null) {
map.put(root.right, root);
findParents(root.right);
}
}
private void findChildren(TreeNode root, TreeNode from, int k) {
if (root == null) {
return ;
}
if (k == 0) {
ans.add(root.val);
return ;
}
if (root.left != from) {
findChildren(root.left, root, k - 1);
}
if (root.right != from) {
findChildren(root.right, root, k - 1);
}
if (map.get(root) != from) {
findChildren(map.get(root), root, k - 1);
}
}
}
时间复杂度为O(n)
,空间复杂度为O(n)