问题
- 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:”对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且
x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解决
//1、两次遍历
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode current=root;
List p_path=reNodePath(current,p);
List q_path=reNodePath(current,q);
TreeNode now=null;
int len1=Math.min(q_path.size(),p_path.size());
for(int i=0;i reNodePath(TreeNode root,TreeNode targer){
List path=new ArrayList();
while(root!=targer){
path.add(root);
if(targer.val
//2、一次遍历:当便利到目标结点的时候,q、p一定在目标结点的两边
class Solution{
public TreeNode lowestCommonAncestor(TreeNode root,TreeNode q,TreeNode p){
TreeNode cur=root;
while(true){
if(q.valcur.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.valroot.val&&p.val>root.val) return lowestCommonAncestor(root.right,q,p);
return root;
}
}
时间复杂度:O(N)
空间复杂度:O(N)
总结:
- 三种方法都是根据二叉搜索树的性质来,从路径出发找到最终结点。
Original: https://www.cnblogs.com/zhangsanM/p/16567991.html
Author: new_monkey
Title: 算法:二叉搜索树的最近公共祖先
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/605175/
转载文章受原作者版权保护。转载请注明原作者出处!