给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:首先这是一个二叉搜索树,也是右子树比左子树的大
可以递归来实现,如果p,q节点分别是一个小于一个大于或者一个大于一个小于当前节点,那么该节点就是他们的最近公共祖先;如果全都都小于该节点,那么就遍历左子树,公共节点肯定在左子树上,同理都大于的话,肯定在右子树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if((root->val>=p->val&&root->val<=q->val)||(root->val<=p->val&&root->val>=q->val)){
return root;
}
else if(root->val>p->val&&root->val>q->val){
return lowestCommonAncestor(root->left,p,q);
}
else{
return lowestCommonAncestor(root->right,p,q);
}
}
};
之前很迷递归,尤其是树,感觉无从下手,现在也很迷,但是这样看看,就是说要有一个整体的观点,至于递归过程中他怎么实现的,不用管,只要知道逻辑就行了
题升:如果该题不是二叉搜索树,而是一个普通的二叉树,你该怎么办呢
同样用递归,那是不是可以分别递归左右子树,然后判断在左右子树是否出现p.q,如果是空的话,返回给他空,如果是p,q的话返回给他当前这个节点,那么我们是不是可以判端返回的左右子树是不是为空,如果左为空的话,就说明p,q都在右子树上,那么我们就返回右子树返回来的节点,肯定是首次遇到的p,q中的节点的某一个,那他肯定就是最近公共祖先了;同理右子树为空也是这样的;如果返回的两个左右子树都不为空的话,那么就说明,p,q分别在当前节点的左右子树上,那么我们返回当前节点就可以了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL||p == root||q == root){
return root;
}
TreeNode * L = lowestCommonAncestor(root->left,p,q);
TreeNode *R = lowestCommonAncestor(root->right,p,q);
if(L == NULL)return R;
if(R == NULL)return L;
return root;
}
};