首页 > 代码库 > 二叉树中寻找共同节点的最低公共祖先节点

二叉树中寻找共同节点的最低公共祖先节点

问题:在一棵二叉树中,给定两个节点,求这两个节点的最低的公共祖先节点,如下图中的,节点 6 和 节点 9 的最低公共祖先节点是节点 5.


最容易联想到的是,这个问题似乎与公共子串的问题有关系,如果我们能求出两个节点到根节点的路径,再使用匹配算法得到公共的路径,取这个路径上最后一个节点,即是所求的最低公共祖先节点。

哈夫曼编码启迪了我,我打算使用 0 表示向左走,1 表示向右走。如,101 表示自根节点,走到右孩子 A,再走到 A 的左孩子 B,再走到 B 的右孩子 C 。于是,根节点到节点 C 的路径便可以使用整数 101 ,即 5 表示,基于这个思路,我们只需要用一个整数即可表示根节点到任何一个节点的路径(如果这个路径大于 32 ,我们可以考虑使用大整数,或者模拟一个大整数)。


想到了这一层,就没有什么难度了,我们只需要针对两个节点,分别求出根节点(如果题目要求的是自根节点开始算起)到这两个节点的路径,再求公共路径上最后一个节点即可。

给出源代码。

<script src="https://code.csdn.net/snippets/441427.js" type="text/javascript"></script>

该题来源:

何海涛博客:http://zhedahht.blog.163.com/blog/static/25411174201081263815813/

该作者在文章中提到了两种解法,一种是递归的,如果两个节点都在当前节点的左子树,或者右子树中,那么,它们的最低公共祖先节点必然在左子树或者右子树中。如果分散在两个子树中,那么,当前节点就是最低公共祖先节点。

另一种与本文解法类似,只不过空间复杂度要高于本文解法。