目录
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先
a 小部件
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
【解法一】利用二叉搜索树条件
由于满足二叉搜索树的特点,如果p的值小于等于root并且q的值大于等于root(或者q大p小)
只要是root的值处于俩个结点的值之间,那么就说明pq就在root的俩侧,那么就是祖先结点了。
如果p小于root q也小于root那么pq都在二叉树左侧,那就往left遍历
如果pq都大于root,按摩pq都在二叉树的右侧,那就往right遍历。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==nullptr)return nullptr;
if((p->val<=root->val && q->val>=root->val) || (p->val>=root->val && q->val<=root->val))
return root;
else if(p->val < root->val && q->val < root->val)
return lowestCommonAncestor(root->left, p, q);
else
return lowestCommonAncestor(root->right, p, q);
}
};
【解法二】递归接收左右子树的函数返回值,如果返回值都为NULL返回NULL
如果一个为NULL那么返回另外一个,如果俩个都不为空,那么pq就在root俩侧,返回root
递归结束条件,root 为 NULL 或者root和pq某一个相同。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL || root==p || root==q)
return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left==NULL&&right==NULL)return NULL;
if(left==NULL)return right;
if(right==NULL)return left;
return root;
}
};
剑指 Offer 68 - II. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root==NULL || root==p || root==q) return root; TreeNode* left = lowestCommonAncestor(root->left, p, q); TreeNode* right = lowestCommonAncestor(root->right, p, q); if(left==NULL&&right==NULL)return NULL; if(left==NULL)return right; if(right==NULL)return left; return root; } };