863:二叉树中所有距离为 K 的结点
This commit is contained in:
parent
16080bac5b
commit
1c8011ef2b
@ -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
Loading…
Reference in New Issue
Block a user