剑指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对答如流系列 - 树中两个结点的最低公共祖先的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer对答如流系列 - 二叉搜索树的第k个结点

剑指Offer打卡day43—— ACWing 88. 树中两个结点的最低公共祖先

剑指Offer对答如流系列 - 链表中环的入口节点

剑指Offer对答如流系列 - 合并两个排序的链表

剑指Offer对答如流系列 - 链表中倒数第k个结点

剑指Offer对答如流系列 - 在O时间删除链表结点