九章算法面试题56 最近公共祖先

来源:互联网 发布:java divide是什么 编辑:程序博客网 时间:2024/06/08 15:40

九章算法官网-原文网址


http://www.jiuzhang.com/problem/56/


题目

给出一棵二叉树和两个二叉树上的节点,求出这两个点的最近公共祖先(Lowest Common Ancestor, LCA)。

如下面这棵二叉树:

          1

        /    \

       2     3

            /    \

          4       5

4和5的最近公共祖先是3,2和4的最近公共祖先是1,1和3的最近公共祖先是1(假设自己是自己的祖先)


Follow Up Question 1: 如果树中的每个节点存储了自己的parent节点,算法应该是什么样的?

Follow Up Question 2: 如果树中的每个节点没有存储自己的parent节点,但给你这棵二叉树的根节点,算法应该是什么样的?



解答


对于有parent节点的二叉树,方法很简单,就是分别从两个节点网上列出到根的所有点,再反向查找第一个分叉的位置。

对于没有parent节点的二叉树,必须给出root。然后从root开始用分治算法往两边查找两个节点。如果有LCA就返回LCA,如果碰到其中一个点就返回其中一个点。


参考程序

http://www.ninechapter.com/solutions/lowest-common-ancestor/ http://www.ninechapter.com/solutions/lowest-common-ancestor/ http://www.ninechapter.com/solutions/lowest-common-ancestor/ http://www.ninechapter.com/solutions/lowest-common-ancestor/


0 0
原创粉丝点击