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

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

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

O1和O2的两种位置情况

O1和O2互为祖先节点

O1和O2不互为祖先节点

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
        return process(root, o1, o2).val;
    }

    public TreeNode process (TreeNode root, int o1, int o2) {
        // 如果当前节点为空,或者当前节点就是01或02,那就直接返回当前节点
        // 如果一棵树不包含o1或o2,那么它的返回值必然是null,因为叶子节点的返回值就为null
        // 如果o1是o2的祖先节点或者o2是o1的祖先节点,那么从上往下遍历的时候
        // 因为该if条件,必然会直接返回祖先节点
        // 如果o1和o2不是互为祖先节点,那只能是有一个最近的祖先节点
        // 那么对于一棵子树来说,想要有返回值,那么必须得包含o1或者o2,因此该函数的最终返回值为非空的节点
        // 如果一棵子树的左右两个孩子节点所对应的两棵子树的返回值就是o1和o2,那么就直接返回当前节点即可
        // 也就是说: 如果当前节点的左右孩子节点的返回值都不为空,就直接返回当前节点即可
        if (root == null || root.val == o1 || root.val == o2) {
            return root;
        }

        TreeNode left = process(root.left, o1, o2);
        TreeNode right = process(root.right, o1, o2);

        if (left != null && right != null) {
            return root;
        }

        return left != null ? left : right;
    }
}
全部评论

相关推荐

09-01 03:31
门头沟学院 Java
我是天子:天天在牛客看到他,原来是卖课的
点赞 评论 收藏
分享
07-31 16:30
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务