给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点2
和节点8
的最近公共祖先是6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点2
和节点4
的最近公共祖先是2
, 因为根据定义最近公共祖先节点可以为节点本身。
说明:
//本题,由于是找到 == q,p的parent,所以找到就返回,而不用遍历整棵树,所以,采用return
。递归函数有返回值,那就是搜索一条边,符合就立即返回。但是有返回值(搜索一条边),也要看,是搜索一条边还是整棵树。很明显二叉搜索树,不需要搜索整棵树。而二叉树需要搜索整棵树,因为没有二叉搜索树的特性,导致需要右子树的返回值做判断。
class Solution {
public:
TreeNode* dfs(TreeNode* root,TreeNode* p,TreeNode* q){
if(!root) return root;
//中序
if(root->val > p->val && root->val > q->val){
TreeNode* left = NULL;
left = dfs(root->left,p,q);
if(left) return left;
}
else if(root->val < p->val && root->val < q->val){
TreeNode* right = NULL;
right = dfs(root->right,p,q);
if(right) return right; //由于是找到符合的值就返回,所以是遍历一条边,而不是整棵树
}
return root;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//dfs
if(!root) return root;
return dfs(root,p,q);
}
};
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//迭代
TreeNode* cur = root;
while(cur){
if(cur->val < q->val && cur->val < p->val){
cur = cur->right;
}
else if(cur->val > q->val && cur->val > p->val){
cur = cur->left;
}
else{
return cur;
}
}
return cur;
}
};