863:二叉树中所有距离为 K 的结点

This commit is contained in:
huangge1199@hotmail.com 2021-07-28 23:24:22 +08:00
parent 16080bac5b
commit 1c8011ef2b
2 changed files with 77 additions and 35 deletions

View File

@ -63,52 +63,94 @@ public class AllNodesDistanceKInBinaryTree {
* } * }
*/ */
class Solution { class Solution {
private Stack<TreeNode> stack = new Stack<>(); // private Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>(); // 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) { public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
if (k == 0) { // root 出发 DFS记录每个结点的父结点
return Arrays.asList(target.val); findParents(root);
}
if (!root.val.equals(target.val)) { // target 出发 DFS寻找所有深度为 k 的结点
serchTarget(root, target.val, true); findAns(target, null, 0, k);
}
int index = 1; return ans;
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) { public void findParents(TreeNode node) {
if (root == null) { if (node.left != null) {
return true; parents.put(node.left.val, node);
findParents(node.left);
} }
if (root.val == val) { if (node.right != null) {
return false; parents.put(node.right.val, node);
findParents(node.right);
} }
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) { public void findAns(TreeNode node, TreeNode from, int depth, int k) {
if (root == null) { if (node == null) {
return; return;
} }
if (index == k) { if (depth == k) {
list.add(root.val); ans.add(node.val);
return; return;
} }
dfs(root.left, index + 1, k); if (node.left != from) {
dfs(root.right, index + 1, k); 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) //leetcode submit region end(Prohibit modification and deletion)

File diff suppressed because one or more lines are too long