java: add «2096. Step-By-Step Directions From a Binary Tree Node to Another»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
be27f896dc
commit
33e47203c6
1 changed files with 70 additions and 0 deletions
|
@ -0,0 +1,70 @@
|
||||||
|
class Solution {
|
||||||
|
private TreeNode getLowestCommonAncestor(TreeNode node, int key1, int key2) {
|
||||||
|
if (node == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.val == key1 || node.val == key2) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = getLowestCommonAncestor(node.left, key1, key2);
|
||||||
|
var right = getLowestCommonAncestor(node.right, key1, key2);
|
||||||
|
|
||||||
|
if (left == null) {
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (right == null) {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private record Path(boolean found, StringBuilder path) {}
|
||||||
|
|
||||||
|
private Path getPath(TreeNode node, int key, StringBuilder path) {
|
||||||
|
if (node == null) {
|
||||||
|
return new Path(false, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.val == key) {
|
||||||
|
return new Path(true, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// go left
|
||||||
|
path.append('L');
|
||||||
|
var leftPath = getPath(node.left, key, path);
|
||||||
|
if (leftPath.found) {
|
||||||
|
return leftPath;
|
||||||
|
}
|
||||||
|
path.deleteCharAt(path.length() - 1);
|
||||||
|
|
||||||
|
// go right
|
||||||
|
path.append('R');
|
||||||
|
var rightPath = getPath(node.right, key, path);
|
||||||
|
if (rightPath.found) {
|
||||||
|
return rightPath;
|
||||||
|
}
|
||||||
|
path.deleteCharAt(path.length() - 1);
|
||||||
|
|
||||||
|
return new Path(false, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDirections(TreeNode root, int startValue, int destValue) {
|
||||||
|
var commonAncestor = getLowestCommonAncestor(root, startValue, destValue);
|
||||||
|
var pathToStart = getPath(commonAncestor, startValue, new StringBuilder());
|
||||||
|
var pathToDest = getPath(commonAncestor, destValue, new StringBuilder());
|
||||||
|
|
||||||
|
var directions = new StringBuilder();
|
||||||
|
|
||||||
|
// gotta go up from the start
|
||||||
|
directions.repeat('U', pathToStart.path.length());
|
||||||
|
|
||||||
|
// and then follow the directions down
|
||||||
|
directions.append(pathToDest.path);
|
||||||
|
|
||||||
|
return directions.toString();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue