package NC;
/**
* NC102 在二叉树中找到两个节点的最近公共祖先
*
* 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
*
* 要求:空间复杂度O(1) ,时间复杂度O(n)
*
* @author Tang
* @date 2021/9/29
*/
public class LowestCommonAncestor {
int o1;
int o2;
int result = 0;
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
this.o1 = o1;
this.o2 = o2;
preSearch(root);
return result;
}
/**
* 前序遍历
* 根左右
* 判断其左右节点是否包含,如果有则根节点为最近祖先,
*
*
*
* @param node
* @return 当前节点的左子树包含几个元素
*/
private int preSearch(TreeNode node){
if(node == null) {
return 0;
}
int left = preSearch(node.left);
int right = preSearch(node.right);
if(left == 2) {
result = node.left.val;
return -1;
}
if(right == 2) {
result = node.right.val;
return -1;
}
//如果包含元素
if(left + right == 2) {
result = node.val;
return -1;
}
if(node.val == o1 || node.val == o2) {
return left + right +1;
}
return left + right;
}
public static void main(String[] args) {
}
}