LeetCode 二叉树的最近公共祖先
@author:Jingdai
@date:2020.11.06
题目描述(236题)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
注意:一个节点也可以是它自己的祖先。
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
题目分析
如图,二叉树的公共祖先分成两种情况。第一种情况是两个节点 p
、q
分别位于最近公共祖先的异侧。第二种情况是两个节点 p
、q
其一就是他们的公共祖先,另一个节点位于它的子树中。
思路及代码
对于上面的分析,这里使用三种方式解决这个问题。
方法1:基于路径的方法
不管最近公共祖先是上面的情况1还是情况2,我们都可以根据根节点到节点 p
和根节点到节点 q
的的路径求出最近公共祖先。
如图,对于情况1,根节点到节点3的路径为 [0, 1, 3]
,根节点到节点2的路径为 [0, 2]
,最近公共祖先就是最后一个相同的节点 0 。
对于情况2,根节点到节点5的路径为 [0, 1, 3, 5]
,根节点到节点1的路径为 [0, 1]
,最近公共祖先还是最后一个相同的节点 1 。
综上,可以先求出根节点到节点 p
和根节点到节点 q
的路径,然后求出两个路径中最后一个相同的节点就是最近公共祖先。
接下来的问题就是如何求根节点到某节点的路径了,可以参考之前的博客 求二叉树根节点到指定节点的路径。下面是完整的代码。
代码
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
LinkedList<TreeNode> pPath = new LinkedList<>();
getPathToTarget(root, p, pPath);
LinkedList<TreeNode> qPath = new LinkedList<>();
getPathToTarget(root, q, qPath);
TreeNode ancestor = null;
while (true) {
if (pPath.size()