|
1 |
| -/** |
2 |
| - * Definition for a binary tree node. |
3 |
| - * public class TreeNode { |
4 |
| - * int val; |
5 |
| - * TreeNode left; |
6 |
| - * TreeNode right; |
7 |
| - * TreeNode() {} |
8 |
| - * TreeNode(int val) { this.val = val; } |
9 |
| - * TreeNode(int val, TreeNode left, TreeNode right) { |
10 |
| - * this.val = val; |
11 |
| - * this.left = left; |
12 |
| - * this.right = right; |
13 |
| - * } |
14 |
| - * } |
15 |
| - */ |
16 | 1 | class Solution {
|
17 |
| - static byte[] path = new byte[200_001]; |
18 |
| - int strtLevel = -1; |
19 |
| - int destLevel = -1; |
20 |
| - int comnLevel = -1; |
21 |
| - |
22 | 2 | public String getDirections(TreeNode root, int startValue, int destValue) {
|
23 |
| - findPaths(root, startValue, destValue, 100_000); |
24 |
| - int answerIdx = comnLevel; |
25 |
| - for (int i = strtLevel; i > comnLevel; i--) |
26 |
| - path[--answerIdx] = 'U'; |
27 |
| - return new String(path, answerIdx, destLevel - answerIdx); |
| 3 | + TreeNode node = lca(root, startValue, destValue); |
| 4 | + StringBuilder pathToStart = new StringBuilder(); |
| 5 | + StringBuilder pathToDest = new StringBuilder(); |
| 6 | + dfs(node, startValue, pathToStart); |
| 7 | + dfs(node, destValue, pathToDest); |
| 8 | + return "U".repeat(pathToStart.length()) + pathToDest.toString(); |
28 | 9 | }
|
29 |
| - |
30 |
| - private int findPaths(TreeNode node, int strtVal, int destVal, int level) { |
31 |
| - if (node == null) return 0; |
32 |
| - int result = 0; |
33 |
| - if (node.val == strtVal) { |
34 |
| - strtLevel = level; |
35 |
| - result = 1; |
36 |
| - } else if (node.val == destVal) { |
37 |
| - destLevel = level; |
38 |
| - result = 1; |
| 10 | + |
| 11 | + private TreeNode lca(TreeNode node, int p, int q) { |
| 12 | + if (node == null || node.val == p || node.val == q) { |
| 13 | + return node; |
39 | 14 | }
|
40 |
| - int leftFound = 0; |
41 |
| - int rightFound = 0; |
42 |
| - if (comnLevel < 0) { |
43 |
| - if (destLevel < 0) path[level] = 'L'; |
44 |
| - leftFound = findPaths(node.left, strtVal, destVal, level + 1); |
45 |
| - rightFound = 0; |
46 |
| - if (comnLevel < 0) { |
47 |
| - if (destLevel < 0) path[level] = 'R'; |
48 |
| - rightFound = findPaths(node.right, strtVal, destVal, level + 1); |
49 |
| - } |
| 15 | + TreeNode left = lca(node.left, p, q); |
| 16 | + TreeNode right = lca(node.right, p, q); |
| 17 | + if (left != null && right != null) { |
| 18 | + return node; |
50 | 19 | }
|
51 |
| - if (comnLevel < 0 && leftFound + rightFound + result == 2) |
52 |
| - comnLevel = level; |
53 |
| - return result | leftFound | rightFound; |
| 20 | + return left != null ? left : right; |
| 21 | + } |
| 22 | + |
| 23 | + private boolean dfs(TreeNode node, int x, StringBuilder path) { |
| 24 | + if (node == null) { |
| 25 | + return false; |
| 26 | + } |
| 27 | + if (node.val == x) { |
| 28 | + return true; |
| 29 | + } |
| 30 | + path.append('L'); |
| 31 | + if (dfs(node.left, x, path)) { |
| 32 | + return true; |
| 33 | + } |
| 34 | + path.setCharAt(path.length() - 1, 'R'); |
| 35 | + if (dfs(node.right, x, path)) { |
| 36 | + return true; |
| 37 | + } |
| 38 | + path.deleteCharAt(path.length() - 1); |
| 39 | + return false; |
54 | 40 | }
|
55 | 41 | }
|
0 commit comments