leet-code/src/main/java/leetcode/editor/cn/AllNodesDistanceKInBinaryTree.java
2021-07-28 23:24:22 +08:00

158 lines
4.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//给定一个二叉树(具有根结点 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 的结点,
//值分别为 74以及 1
//
//
//
//注意,输入的 "root" 和 "target" 实际上是树上的结点。
//上面的输入仅仅是对这些对象进行了序列化描述。
//
//
//
//
// 提示:
//
//
// 给定的树是非空的。
// 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
// 目标结点 target 是树上的结点。
// 0 <= K <= 1000.
//
// Related Topics 树 深度优先搜索 广度优先搜索 二叉树
// 👍 354 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.TreeNode;
import java.util.*;
//863:二叉树中所有距离为 K 的结点
public class AllNodesDistanceKInBinaryTree {
public static void main(String[] args) {
//测试代码
Solution solution = new AllNodesDistanceKInBinaryTree().new Solution();
TreeNode root = new TreeNode();
root = root.preTreeNode(Arrays.asList(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4));
solution.distanceK(root, root.search(root, 5), 2);
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// private Stack<TreeNode> stack = new Stack<>();
// List<Integer> list = new ArrayList<>();
//
// public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
// if (k == 0) {
// return Arrays.asList(target.val);
// }
// if (!root.val.equals(target.val)) {
// serchTarget(root, target.val, true);
// }
// int index = 1;
// while (!stack.isEmpty() && k >= index) {
// TreeNode node = stack.pop();
// dfs(node, 0, k - index);
// index++;
// }
// return list;
// }
//
// private boolean serchTarget(TreeNode root, int val, boolean bl) {
// if (root == null) {
// return true;
// }
// if (root.val == val) {
// return false;
// }
// if (bl) {
// stack.push(root);
// }
// bl = serchTarget(root.left, val, bl) || serchTarget(root.right, val, bl);
// if (bl) {
// stack.pop();
// }
// return bl;
// }
//
// private void dfs(TreeNode root, int index, int k) {
// if (root == null) {
// return;
// }
// if (index == k) {
// list.add(root.val);
// return;
// }
// dfs(root.left, index + 1, k);
// dfs(root.right, index + 1, k);
// }
Map<Integer, TreeNode> parents = new HashMap<Integer, TreeNode>();
List<Integer> ans = new ArrayList<Integer>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
// 从 root 出发 DFS记录每个结点的父结点
findParents(root);
// 从 target 出发 DFS寻找所有深度为 k 的结点
findAns(target, null, 0, k);
return ans;
}
public void findParents(TreeNode node) {
if (node.left != null) {
parents.put(node.left.val, node);
findParents(node.left);
}
if (node.right != null) {
parents.put(node.right.val, node);
findParents(node.right);
}
}
public void findAns(TreeNode node, TreeNode from, int depth, int k) {
if (node == null) {
return;
}
if (depth == k) {
ans.add(node.val);
return;
}
if (node.left != from) {
findAns(node.left, node, depth + 1, k);
}
if (node.right != from) {
findAns(node.right, node, depth + 1, k);
}
if (parents.get(node.val) != from) {
findAns(parents.get(node.val), node, depth + 1, k);
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}