最近公共祖先节点详细解析

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

http://www.nowcoder.com/questionTerminal/e0cc33a83afe4530bcec46eba3325116

寻找最近的公共祖先节点:则只会出现三种情况才返回对当前节点

  • 1.当前节点为o1,o2中的一个,且另一个在其左子树中
  • 2.当前节点为o1,o2中的一个,且另一个在其右子树中
  • 3.当前节点不为o1,o2任一一个,但是o1,o2分别存在于其左右子树中
    那么我们在判断当前节点是否是需要返回的就只需要以下步骤:
    • 1.判断目标节点在左右子树中是否存在
    • 2.根据左右子树返回的情况,判断属于前面三种情况的哪一种
    • 3.如果不是当前节点,则需要判断接下来进入哪一个节点
      具体代码如下
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        // write code here
        //当前节点分别求出左右子树是否存在目标节点
        boolean left = search(root.left,o1,o2);
        boolean right = search(root.right,o1,o2);
        if(left && right){
            return root.val;
        }else{
            if(root.val == o1 || root.val == o2){
                return root.val;
            }else{
                return left == true ? lowestCommonAncestor(root.left,o1,o2) : lowestCommonAncestor(root.right,o1,o2);
            }
        }
    }

    //定义方法,返回当前节点下,是否存在指定值得节点
    public boolean search(TreeNode root,int target1,int target2){
        if(root == null)return false;
        if(root.val == target1 || root.val == target2)return true;
        return search(root.right,target1,target2) || search(root.left,target1,target2);
    }
}
全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务