题目:二叉搜索树的最近公共祖先
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/
找到p,q的两个最近公共祖先x, x的深度尽可能大
1Solution 迭代(记录路径)Accepted / Used 时空复杂度 O(n) O(n)
/*
记录路径,根节点到p,path_p[], 根节点到q,path_q。最后一次相同的节点即是最近公共祖先
*/
class Solution {
static List<TreeNode> getPath(TreeNode root,TreeNode t) {
List<TreeNode> list = new ArrayList<>();
while(true) {
list.add(root);
if(root.val==t.val) break;
else if(root.val>t.val) root = root.left;
else root = root.right;
}
return list;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> list_p = getPath(root,p);
List<TreeNode> list_q = getPath(root,q);
TreeNode ans = null;
for(int i = 0; i < Math.min(list_p.size(),list_q.size()); ++i) {
if(list_p.get(i)==list_q.get(i)) {
ans = list_p.get(i);
}else {
break;
}
}
return ans;
}
}
1Solution <递归(官方)> Accepted / Used 时空复杂度 O(n) O(1)
/*
p.val < q.val
根节点.val < p.val 说明最近公共祖先在左边,往左搜索
根节点.val > q.val 说明最近公共祖先在右边边,往右搜索
p.val <= root.val <= q.val,即可直接返回
搜索的过程是可以保证答案一定存在的
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return null;
int v1 = Math.min(p.val,q.val),v2 = Math.max(p.val,q.val);
if(root.val>=v1&&root.val<=v2) return root;
if(root.val>v2) return lowestCommonAncestor(root.left,p,q);
return lowestCommonAncestor(root.right,p,q);
}
}