方法一
下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题
1) 找到从根到n1的路径,并存储在一个向量或数组中。
2)找到从根到n2的路径,并存储在一个向量或数组中。
3) 遍历这两条路径,直到遇到一个不同的节点,则前面的那个即为最低公共祖先.
方法二 (不利用额外空间,一次遍历)
从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则root就是LCA. 如果两个key都出现在左子树,则说明LCA在左子树中,否则在右子树。
public class App
{
static class Node {
Node left;
Node right;
int key;
Node(int key) {
this.key = key;
this.left = null;
this.right = null;
}
}
static Node findLCA(Node root, int n1, int n2) {
if(root == null) {
return null;
}
if(root.key == n1 || root.key == n2) {
return root;
}
Node left = findLCA(root.left, n1, n2);
Node right = findLCA(root.right, n1, n2);
if(left!=null && right!=null) {
return root;
}
else {
return left!=null?left:right;
}
}
public static void main( String[] args )
{
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right.left = new Node(6);
root.right.right = new Node(7);
System.out.println(findLCA(root, 4, 6).key);
}
}