问题:
给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA)。
比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8。
分析:
我们这里先考虑一般的二叉树(BT),然后再考虑这个二叉树是二叉搜索树(BST)的情况。
/* * check whether the node n is in the tree */ private static boolean covers(Node rootNode, Node n) { if(rootNode == null) return false; if(rootNode == n) return true; return covers(rootNode.leftChild, n) || covers(rootNode.rightChild, n); }
/* * get the first common ancestor of node p and node q */ public static Node commonAncestor(Node rootNode, Node p, Node q) { // case 2 if (covers(rootNode.leftChild, p) && covers(rootNode.leftChild, q)) return commonAncestor(rootNode.leftChild, p, q); //case 3 if (covers(rootNode.rightChild, p) && covers(rootNode.rightChild, q)) return commonAncestor(rootNode.rightChild, p, q); //case 1 return rootNode; }
public Node LCA(Node root, Node p, Node q) { if (root == null || p == null || q == null ) return NULL; if (max(p.data, q.data) < root.data) return LCA(root.left, p, q); else if (min(p.data, q.data) > root.data) return LCA(root.right, p, q); else return root; }