剑指 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. 二叉树/二叉搜索树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode664. 奇怪的打印机 / 剑指 Offer 55 - I. 二叉树的深度 / 剑指 Offer 55 - II. 平衡二叉树
简洁写法剑指 Offer 32 - I. 从上到下打印二叉树
简洁写法剑指 Offer 32 - I. 从上到下打印二叉树