首页 > 编程语言 >剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题)

剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题)

时间:2023-03-14 11:31:51浏览次数:47  
标签:right java Offer 节点 二叉树 TreeNode root find left

(剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题))

1. 题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]   示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。 示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。  

说明:

所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。

作者:Krahets 链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/57euni/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2. 解题思路

根据之前二叉搜索树最远公共祖先结点的求解,可以考虑分为root、左子树、右子树三部分来考虑。

  • 针对左右子树,分别查找节点pq位于哪一侧;
  • 如果两个节点分别位于两侧,可以证明当前root节点是最近的公共根节点;
  • 如果两个节点并不位于两侧,从题目已知两个节点一定在二叉树中,因此可以推断,两个节点位于同一侧;
  • 若两节点均位于左侧,则公共根节点一定位于root的左子树中,右侧同理
  • 之后可考虑使用递归来求解该问题,注意递归的终止条件:root==null或者root自身就是p、q之一

对于节点p、q位于哪一侧的查找,在算法中使用findNode()函数进行递归查找。

3. 数据类型功能函数总结

//无

4. java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //左右子树中查找节点p\q,如果分别位于左右子树,root为公共节点,不然说明两个节点位于同一侧,则直接到某一侧查找
    //查找节点——遍历
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null||root==p||root==q){
            return root;
        }
        //节点查找
        boolean find_p_left=findNode(root.left,p);
        boolean find_p_right=findNode(root.right,p);
        boolean find_q_left=findNode(root.left,q);
        boolean find_q_right=findNode(root.right,q);
        if((find_p_left&&find_q_right)||(find_p_right&&find_q_left)){
            return root;
        }
        else{
            if(find_p_left){
                return lowestCommonAncestor(root.left,p,q);
            }
            if(find_p_right){
                return lowestCommonAncestor(root.right,p,q);
            }
        }
        return root;
    }
    boolean findNode(TreeNode root,TreeNode x){//递归查找节点
        if(root==null){
            return false;
        }
        else if(root ==x){
            return true;
        }
        else{
            return findNode(root.left,x)||findNode(root.right,x);
        }
    }
}

标签:right,java,Offer,节点,二叉树,TreeNode,root,find,left
From: https://blog.51cto.com/u_15965807/6120150

相关文章

  • JAVA字符串格式化-String.format()的使用
    JAVA字符串格式化-String.format()的使用https://blog.csdn.net/lonely_fireworks/article/details/7962171/常规类型的格式化String类的format()方法用于创建格式化的......
  • 【JavaScript】44_DOM编程初步
    1、初识要使用DOM来操作网页,我们需要浏览器至少得先给我一个对象才能去完成各种操作所以浏览器已经为我们提供了一个document对象,它是一个全局变量可以直接使用document代表......
  • JavaScript
    变量:区分大小写,不把一个值保存到新的变量,这个变量就是一次性的(就是丢了这个数据地址)//驼峰命名var变量名;常量:不可改变的值用常量//全部单词大写,用_分割单词 数......
  • Java面向对象
    方法:packagestudy1;publicclassDemo1{ publicstaticvoidmain(String[]args){ //调用方法 doubleaa=sjx(10,2); System.out.println("三角形的面积......
  • java.security.KeyStoreException: problem accessing trust store
    发送邮件,使用了ssl认证,配置了相关代如下: 相同的配置在本地能发送邮件,在测试环境发送出现了下面的异常: 网上找了一些解决办法,说是把\jre\lib\security下的两个jar包......
  • java操作excel文件——POI
    简述在开发者经常会涉及和excel的交互,如将数据库的数据导出到内存中,如将excel的数据导入到内存中。常用的方式有两种——poi和javaexcel,其中常用的是poiPO......
  • 使用Java替换字符串占位符的几种方法 String url2 = "jdbc:mysql://{0}:{1}/{2}"
    使用Java替换字符串占位符的几种方法https://blog.csdn.net/m0_67402125/article/details/125383655importorg.apache.commons.lang.text.StrSubstitutor;importj......
  • Java FileOutputStream IO 拒绝访问
    很无聊的bug,也是对IO使用不熟悉导致本意是将文件写入这个目录下FileOutputStreamfos=newFileOutputStream("D:/test");然后报拒绝访问的错误,应该这么写FileOut......
  • Java AES 加密解密&& shell 加密解密
    packageemails;importsun.misc.BASE64Decoder;importjavax.crypto.Cipher;importjavax.crypto.spec.SecretKeySpec;importjava.util.Base64;/***AES加......
  • Java 泛型
    泛型类的定义class类名称<泛型标识,泛型标识...>{泛型标识变量名;}常用的泛型标识:TEKV泛型类的使用方法类名<具体的数据类型>对象名=new类名<>();泛型类在创......