zoukankan      html  css  js  c++  java
  • 剑指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);
        }
    
  • 相关阅读:
    主引导扇区的理解
    敏捷的思考
    架构学习笔记
    操作系统笔记
    Docker学习笔记
    技术面试-国外人谈经验
    硬盘的原理学习
    linux压缩和解压命令总结
    好的技术团队和差的技术团队的区别在于技术架构前瞻性和适应变化的能力
    管理者的本质其实就是一个服务者,服务下属的
  • 原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12249498.html
Copyright © 2011-2022 走看看