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

Posted 程序字母K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 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;
    }
};

以上是关于剑指 Offer 67/68 - I. 二叉树/二叉搜索树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer面试题32 - I. 从上到下打印二叉树

LeetCode664. 奇怪的打印机 / 剑指 Offer 55 - I. 二叉树的深度 / 剑指 Offer 55 - II. 平衡二叉树

简洁写法剑指 Offer 32 - I. 从上到下打印二叉树

简洁写法剑指 Offer 32 - I. 从上到下打印二叉树

[LeetCode]剑指 Offer 32 - I. 从上到下打印二叉树

[LeetCode]剑指 Offer 32 - I. 从上到下打印二叉树