遇到这个题要分几种情况
1、该树是一棵二叉搜索树:
由于二叉搜索树是排序过的,位于左子树的结点都比父节点小,而位于右子树的结点都比父节点大,我们只需要从树的根节点开始和两个输入的结点进行比较。如果当前结点的值都比两个结点的值大,那么最低的共同父节点一定是在当前结点的左子树中,于是下一步遍历当前结点的左结点。如果当前结点的值都比两个节点的值小,那么最低共同父节点一定在当前结点的右子树中,于是下一步遍历当前结点的右子结点。这样在树中从上到下找到的第一个在两个输入结点的值之间的结点,就是最低公共祖先。
2、该树甚至连二叉树都不是,而只是普通的树,该怎么办?
(1)树的结点中有指向父节点的指针
如果树中每个结点(除根节点之外)都有一个指向父节点的指针,这个问题可以转换成求两个链表的第一个公共结点。假设树结点中指向父节点的指针是pParent,那么从树的每一个叶结点开始都有一个由指针pParent串起来的链表,这些链表的尾指针都是树的根节点。输入两结点,那么这两个结点位于两个链表上,它们的最低公共祖先刚好就是这两个链表的第一个公共结点。比如输入的两个结点分别为F和H,那么F在链表F->D->B->A上,而H在链表H->E->B->A上,这两个链表的第一个交点B刚好也是它们最低公共祖先
(2)该树中没有指向父节点的指针
<1>所谓两个结点的公共祖先,指的是这两个结点都出现在某个结点的子树中,我们可以从根节点开始遍历一棵树,每遍历到一个结点时,判断两个输入结点是不是在它的子树中。如果在子树中