今天继续刷LeetCode,第235题,求两个节点的最小公共祖先。
分析:
因为这是一颗二叉搜索树,因此可以利用根节点左边的值比根值小,后边比根值大的特性,比较p,q,两个节点的值与根节点的值的大小,如果两者都出现在一边,那么递归遍历左右子树,如果出现在两边,那么就返回根节点。
问题:
1、利用题目的信息,以及二叉搜索树的特性解题;
2、return的条件;
附上C++代码:
/**
* 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)
return NULL;
while(root)
{
if(p->val>root->val&&q->val>root->val)
root=root->right;
else if(p->val<root->val&&q->val<root->val)
root=root->left;
else
return root;
}
return root;
}
};
附上Python代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root==None:
return None
if root.val<q.val and root.val<p.val:
return self.lowestCommonAncestor(root.right,p,q)
elif root.val>q.val and root.val>p.val:
return self.lowestCommonAncestor(root.left,p,q)
else:
return root