栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【NK四】 在二叉树中找到两个节点的最近公共祖先

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【NK四】 在二叉树中找到两个节点的最近公共祖先

在二叉树中找到两个节点的最近公共祖先

根据公共祖先的定义,若root是o1、o2的最近公共祖先,则只可能为以下三种情况之一

  1. p 和 q 分别在 root 的左右子树中
  2. p = root 且 q 在 root 的 左或右子树中
  3. q = root 且 p 在 root 的 左或右子树中
import java.util.*;
public class Solution {

    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        return CommonAncestor(root, o1, o2).val; 
    }

    public TreeNode CommonAncestor (TreeNode root, int o1, int o2) {
    	// 01_如果root为空,或者root为o1、o2中的一个,则它们的最近公共祖先就为root
        if (root == null || root.val == o1 || root.val == o2) { 
            return root;
        }
		// 02_递归遍历左子树,只要在左子树中找到了o1或o2,则先找到谁就返回谁
        TreeNode left = CommonAncestor(root.left,o1,o2);
        // 03_递归遍历右子树,只要在右子树中找到了o1或o2,则先找到谁就返回谁    
        TreeNode right = CommonAncestor(root.right,o1,o2); 
        // 04_如果在左子树中o1和o2都找不到,则o1和o2一定都在右子树中,右子树中先遍历到的那个就是最近公共祖先(一个节点也可以是它自己的祖先) 
        if (left == null) { 
            return right;
        }else if (right == null) { // 05_否则,如果left不为空,在左子树中有找到节点(o1或o2),这时候要再判断一下右子树中的情况,如果在右子树中,o1和o2都找不到,则 o1和o2一定都在左子树中,左子树中先遍历到的那个就是最近公共祖先(一个节点也可以是它自己的祖先)
            return left;
        }else{
            return root; // 06_否则,当 left和 right均不为空时,说明 o1、o2节点分别在 root异侧, 最近公共祖先即为 root
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306360.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号