码迷,mamicode.com
首页 > 其他好文 > 详细

剑指Offer对答如流系列 - 树中两个结点的最低公共祖先

时间:2020-02-01 19:51:17      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:描述   就是   信息   common   ret   问题分析   nod   off   节点   

面试题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对答如流系列 - 树中两个结点的最低公共祖先

标签:描述   就是   信息   common   ret   问题分析   nod   off   节点   

原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12249498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!