剑指 Offer 67/68 - I. 二叉树/二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先;

相比于二叉树,二叉搜索树也可以用二叉树的方法,又因为二叉搜索树的值有大小之分,所以可以通过判断的得大小,向一个方向去查找;

方法一:二叉树的搜索方法;

采用递归的方法,判断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) return NULL;
    if(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 root;
    else if(_right!=NULL)
    	return _right;
    else return _left;
    return NULL;
    }
};

方法二:通过比较值的大小,向一个方向查找;

通过值得大小判断,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) return NULL;
    if(root==p||root==q)
    return root;
    if(root->val<p->val&&root->val<q->val){
        return lowestCommonAncestor(root->right,p ,q);
    }else if(root->val>p->val&&root->val>q->val){
        return lowestCommonAncestor(root->left,p,q); 
    }else
    return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值