题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
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;
}
}
查看25道真题和解析