1.题目描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围:树上节点数满足 1≤n≤105 1≤n≤105 , 节点值val满足区间 [0,n)
要求:时间复杂度 O(n)O(n)
注:本题保证二叉树中每个节点的val值均不相同。
如当输入{3,5,1,6,2,0,8,#,#,7,4},5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:
所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。
节点本身可以视为自己的祖先
示例1
输入:
{3,5,1,6,2,0,8,#,#,7,4},5,1返回值:
3示例2
输入:
{3,5,1,6,2,0,8,#,#,7,4},2,7返回值:
2
2.解题思路
分类讨论:如果p,q两个点位于左右子树中,那么根节点就是其最近公共祖先;如果p,q位于同一边,则返回p,q两个点中先被访问到的那个点。
3.代码实现
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
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
if (root == null) {
return -1;
}
if (root.val == o1 || root.val == o2) {
return root.val;
}
int left = -1, right = -1;
left = lowestCommonAncestor(root.left, o1, o2);
right = lowestCommonAncestor(root.right, o1, o2);
if (left != -1 && right != -1) {
return root.val;
}
if (left != -1) {
return left;
}
return right;
}
}