剑指Offer对答如流系列 - 树中两个结点的最低公共祖先
Posted jefferychenxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer对答如流系列 - 树中两个结点的最低公共祖先相关的知识,希望对你有一定的参考价值。
面试题68:树中两个结点的最低公共祖先
题目描述
输入两个树结点,求它们的最低公共祖先。
问题分析
这属于剑指Offer面试案例中探讨的一道问题。
在解答之前要先和面试官确定是否为二叉树,如果是,还要确定是否为二叉搜索树,是否有父引用,或者仅仅是普通二叉树。
案例中确定树为二叉树,不过树可能有两种,一种是二叉搜索树,一种是普通树。
二叉树节点的定义
public class Node {
int val = 0;
Node left = null;
Node right = null;
public Node(int val) {
this.val = val;
}
}
如果树为二叉搜索树时,最低公共祖先结点的大小在两个树结点大小的中间。
如果树为普通树时,使用遍历将子结点的信息往上传递。在左右子树中进行查找是否存在两个树结点,如果两个树结点分别在左右子树上,说明该根结点就是它们的最低公共祖先。
问题解答
二叉树
// 二叉搜索树
public Node getLowestCommonParentBST(Node root,Node node1,Node node2) {
while(true) {
if(root==null)
return null;
if(root.val<node1.val && root.val<node2.val) {
root=root.right;
} else if(root.val>node1.val && root.val>node2.val) {
root=root.right;
} else {
return root;
}
}
}
普通二叉树
// 普通二叉树 将下面结点的信息利用递归s往上传递
public Node getLowestCommonParent(Node root, Node node1, Node node2) {
if(root==null || root== node1 || root== node2) {
return root;
}
Node left=getLowestCommonParent(root.left, node1, node2);
Node right=getLowestCommonParent(root.right, node1, node2);
return left==null? right:(right==null? left:root);
}
以上是关于剑指Offer对答如流系列 - 树中两个结点的最低公共祖先的主要内容,如果未能解决你的问题,请参考以下文章