一、题目
给定一个二叉树(具有根结点 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)
