@@ -49,7 +49,7 @@ private TreeNode dfs(TreeNode root, TreeNode p, TreeNode q) {
49
49
50
50
public static class Solution2 {
51
51
/**
52
- * This satisfies the follow-up question: Can you find the LCA traversing the tree, without checking nodes existence?
52
+ * This still checks nodes existence.
53
53
*/
54
54
int found = 0 ;
55
55
@@ -71,4 +71,37 @@ private TreeNode lca(TreeNode root, TreeNode p, TreeNode q) {
71
71
return (left != null && right != null ) ? root : left != null ? left : right ;
72
72
}
73
73
}
74
+
75
+ public static class Solution3 {
76
+ /**
77
+ * Credit: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-ii/solutions/944963/beat-96-recursion-without-count-easy-understanding/
78
+ */
79
+ public TreeNode lowestCommonAncestor (TreeNode root , TreeNode p , TreeNode q ) {
80
+ if (root == null || p == null || q == null ) {
81
+ return null ;
82
+ }
83
+ TreeNode result = findLCA (root , p , q );
84
+ if (result == p ) {
85
+ //if p equals result, we'll check the existence of q in the subtree of p
86
+ return findLCA (p , q , q ) != null ? result : null ;
87
+ } else if (result == q ) {
88
+ //if q equals result, we'll check the existence of p in the subtree of q
89
+ return findLCA (q , p , p ) != null ? result : null ;
90
+ }
91
+ //otherwise, it's this case: (p != result && q != result) || result == null
92
+ return result ;
93
+ }
94
+
95
+ private TreeNode findLCA (TreeNode root , TreeNode p , TreeNode q ) {
96
+ if (root == null || p == root || q == root ) {
97
+ return root ;
98
+ }
99
+ TreeNode left = findLCA (root .left , p , q );
100
+ TreeNode right = findLCA (root .right , p , q );
101
+ if (left != null && right != null ) {
102
+ return root ;
103
+ }
104
+ return left != null ? left : right ;
105
+ }
106
+ }
74
107
}
0 commit comments