
方法1: recursion。因为是BST,所以很明显比大小就行,然后recursion。时间复杂度logn,因为是二分法查找。空间复杂n。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val == p.val || root.val == q.val) return root;
if(p.val < root.val && q.val < root.val){
return lowestCommonAncestor(root.left, p, q);
}else if(p.val > root.val && q.val > root.val){
return lowestCommonAncestor(root.right, p, q);
}else{
return root;
}
}
}
方法2: iteration。时间复杂logn,空间1.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val == p.val || root.val == q.val) return root;
while(root != null){
if(p.val < root.val && q.val < root.val){
root = root.left;
}else if(p.val > root.val && q.val > root.val){
root = root.right;
}else{
return root;
}
}
return null;
}
}
总结:
- 关于tree的题目一般都有两种做法,一种recursion,另一种iteration。
这篇博客介绍了两种方法来在二叉搜索树中找到两个节点的最近公共祖先。方法一是使用递归,时间复杂度为logn,空间复杂度为n。方法二是迭代实现,同样拥有logn的时间复杂度,但空间复杂度降低到1。这两种方法都充分利用了二叉搜索树的性质进行高效查找。
415

被折叠的 条评论
为什么被折叠?



