题目:
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
输出:[7,4,1]
解释:
所求结点为与目标结点(值为 5)距离为 2 的结点,
值分别为 7,4,以及 1
注意,输入的 “root” 和 “target” 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
public class Solution {
List<Integer> list;
TreeNode target;
int k;
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
list=new ArrayList();
this.target = target;
this.k = k;
dfs(root);
return list;
}
public int dfs(TreeNode node) {
if (node == null) return -1;
else if (node == target) {
find(node, 0);
return 1;
} else {
int L = dfs(node.left);
int R = dfs(node.right);
if (L != -1) {
if (L == k) list.add(node.val);
find(node.right, L + 1);
return L + 1;
} else if (R != -1) {
if (R == k) list.add(node.val);
find(node.left, R + 1);
return R + 1;
} else {
return -1;
}
}
}
public void find(TreeNode node, int distance) {
if (node == null) return;
if (distance == k) list.add(node.val);
else {
find(node.left, distance + 1);
find(node.right, distance + 1);
}
}
}
思路:
- 先遍历寻找target,找到target后,在target以下的结点中寻找符合条件的结点;
- 找到target后返回上一个结点,在上一个结点的另一棵子树中寻找符合条件的结点,以此类推,层层向上返回,并在另一颗子树中查找,从而找出在target以上的所有目标。