算法:二叉搜索树的最近公共祖先
问题
- 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且
x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解决
//1、两次遍历
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode current=root;
List<TreeNode> p_path=reNodePath(current,p);
List<TreeNode> q_path=reNodePath(current,q);
TreeNode now=null;
int len1=Math.min(q_path.size(),p_path.size());
for(int i=0;i<len1;i++){
if(p_path.get(i)==q_path.get(i)){
now=q_path.get(i);
}
}
return now;
}
//返回目标结点的路径
public List<TreeNode> reNodePath(TreeNode root,TreeNode targer){
List<TreeNode> path=new ArrayList<TreeNode>();
while(root!=targer){
path.add(root);
if(targer.val<root.val){
root=root.left;
}else{
root=root.right;
}
}
path.add(root);
return path;
}
}
//2、一次遍历:当便利到目标结点的时候,q、p一定在目标结点的两边
class Solution{
public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
TreeNode cur=root;
while(true){
if(q.val<cur.val&&p.val<cur.val){
cur=cur.left;
}
else if(q.val>cur.val&&p.val>cur.val){
cur=cur.right;
}
else{
break;
}
}
return cur;
}
}
//3、递归
class Solution{
public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
if(q.val<root.val&&p.val<root.val) return lowestCommonAncestor(root.left,q,p);
else if(q.val>root.val&&p.val>root.val) return lowestCommonAncestor(root.right,q,p);
return root;
}
}
时间复杂度:O(N)
空间复杂度:O(N)
总结:
- 三种方法都是根据二叉搜索树的性质来,从路径出发找到最终结点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程