题意:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。(所有节点的值都是唯一的。)
方法一:
记录路径和深度
思路:递归一遍二叉树,得到每个节点的父节点和深度。这样,就得到了p、q 不同节点到根节点的路径及长度。先填补路径长度差,即使得p、q 不同节点的深度相同;然后p、q 不同节点都循环的往前跳一格,即可得到最近公共祖先。
class Solution {
public:
int dep[10005];//深度数组
int fa[10005];//父亲数组
int lowestCommonAncestor(TreeNode* root, int p, int q) {
if(root){
dep[root->val]=1;
}
dfs(root);//获取各节点的父节点和各节点的深度
if(dep[p]>dep[q]){//使q的深度大于p
swap(p,q);
}
int x=dep[q]-dep[p];//深度差
while(x--){//使q的深度等于p的深度
q=fa[q];
}
while(p!=q){//循环
p=fa[p];
q=fa[q];
}
return p;
}
void dfs(TreeNode* root){//递归
if(!root)
return;
if(root->left){//递归左儿子
fa[root->left->val]=root->val;
dep[root->left->val]=dep[root->val]+1;
dfs(root->left);
}
if(root->right){//递归右儿子
fa[root->right->val]=root->val;
dep[root->right->val]=dep[root->val]+1;
dfs(root->right);
}
}
};
时间复杂度:
空间复杂度:![]()
方法二:
直接递归
思路:
如果节点 x 是节点 p、q 的最近公共祖先,则节点 p、q 分别一定位于节点 x 的左右子树。又因为是二叉搜索树,所以要么 p 节点的值 < x 节点的值 , x 节点的值 < q 节点的值;要么 q 节点的值 < x 节点的值 , x 节点的值 < p 节点的值
class Solution {
public:
int lowestCommonAncestor(TreeNode* root, int p, int q) {
if(root==nullptr){
return 0;
}
if(p<root->val&&q<root->val){//都小于root的值,则递归左儿子节点
return lowestCommonAncestor(root->left,p,q);
}
if(p>root->val&&q>root->val){//都大于root的值,则递归右儿子节点
return lowestCommonAncestor(root->right,p,q);
}
return root->val;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号