前言
仅记录学习笔记,如有错误欢迎指正。
题目
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。要求:空间复杂度 O(1),时间复杂度 O(n)
注:本题保证二叉树中每个节点的val值均不相同。
如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:
示例
-
输入:[3,5,1,6,2,0,8,#,#,7,4],5,1
-
输出: 3
解法一
关键还是找到最近公共节点的特征:1. 如果该节点不是O1也不是O2,那么O1与O2必然分别在该节点的左子树和右子树中
2. 如果该节点就是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) {
if (root == null) {
return -1;
}
if(o1==root.val || o2==root.val) return root.val;
int left = lowestCommonAncestor(root.left,o1,o2);
int right = lowestCommonAncestor(root.right,o1,o2);
if(left ==-1) return right;
if(right ==-1) return left;
return root.val;
}
}