给定一个二叉树(具有根结点 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" 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。
提示:
给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:树转图,然后从目标节点出发,dfs遍历所有节点。
代码
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode parent;
TreeNode(int x) {
val = x;
}
}
class Solution {
// 记录目标节点
public static int targetNum;
public TreeNode targetNode;
// 树转图
public void treeToGraph(TreeNode root) {
if (root != null) {
// 只是用来记录目标节点
if (root.val == targetNum) {
targetNode = root;
}
if (root.left != null) {
root.left.parent = root;
}
if (root.right != null) {
root.right.parent = root;
}
treeToGraph(root.left);
treeToGraph(root.right);
}
}
public List<Integer> list = new ArrayList<>();
Map<Integer,Boolean> map = new HashMap<>();
// 然后从目标点出发,找到与之距离为K的节点
public void dfs(TreeNode root, int K, int sum) {
// 防止重复访问相同节点 并且减枝
if (root != null && map.get(root.val) == null && sum <= K) {
// 标记使得当前的节点已经被访问
map.put(root.val,true);
// 记录与之距离为K的节点
if (sum == K) {
list.add(root.val);
}
//System.out.println( root.val + " parent :" + (root.parent == null ? null : root.parent.val)
// + " ,left : " + (root.left == null ? null : root.left.val) +
// " ,right : " + (root.right == null ? null : root.right.val) );
dfs(root.parent, K, sum + 1);
dfs(root.left, K, sum + 1);
dfs(root.right, K, sum + 1);
}
}
public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
targetNum = target.val;
// 先进行树转图
treeToGraph(root);
// 然后从目标节点出发
dfs(targetNode, K, 0);
return list;
}
}