import java.util.*;
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) {
this.val = val;
}
}
public class LCABruteForce {
public static boolean findPath(TreeNode root, TreeNode target, List<TreeNode> path) {
if (root == null) return false;
path.add(root);
if (root == target) return true;
if (findPath(root.left, target, path) || findPath(root.right, target, path))
return true;
path.remove(path.size() - 1);
return false;
}
public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> path1 = new ArrayList<>();
List<TreeNode> path2 = new ArrayList<>();
if (!findPath(root, p, path1) || !findPath(root, q, path2)) {
return null;
}
int i = 0;
while (i < path1.size() && i < path2.size()) {
if (path1.get(i) != path2.get(i)) break;
i++;
}
return path1.get(i - 1);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(5);
root.right = new TreeNode(1);
root.left.left = new TreeNode(6);
root.left.right = new TreeNode(2);
root.right.left = new TreeNode(0);
root.right.right = new TreeNode(8);
root.left.right.left = new TreeNode(7);
root.left.right.right = new TreeNode(4);
TreeNode p = root.left;
TreeNode q = root.left.right.right;
TreeNode lca = lowestCommonAncestor(root, p, q);
System.out.println("LCA of " + p.val + " and " + q.val + " is: " + lca.val);
}
}