什么是二叉搜索树?
对于二叉树的任意一个节点n:
(1)其左子树下的每个节点的值都小于节点n的值;
(2)其左子树下的每个节点的值都大于节点n的值;
思路与算法
从根节点开始遍历;
- 如果当前节点的值大于p和q的值,说明p和q应该在当前节点的左子树,应该将当前节点移动到它的左子节点;
- 如果当前节点的值小于p和q的值,说明p和q应该在当前节点的右子树,应该将当前节点移动到它的右子节点;
- 如果当前节点不满足上述两条条件,当前节点是分叉点,要么p和q在不同的树上,要么其中一个当前节点。
注意:这里的是二叉树,不是二叉搜素树。
分为以下几种情况:
- p=root,q在root的左子树或者右子树中;
- q=root,p在root的左子树或者右子树中;
- p和q都在root的子树中;
# 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':
self.ans=TreeNode(0)
def dfs(root,p,q):
if not root:
return False
lson=dfs(root.left,p,q)
rson=dfs(root.right,p,q)
if (lson and rson) or((lson or rson) or (root.val==p.val or root.val==q.val)):
self.ans=root
return lson or rson or p.val==root.val or q.val==root.val
dfs(root,p,q)
return self.ans
定义了lson和rson两个参数来表明p或者q是否存在左右子树中
lson=dfs(root.left,p,q)
rson=dfs(root.right,p,q)
如果lson或者rson都为True的话,那么当前节点就是最近公共祖先;如果root=q,且p在左右子树中,那么当前root就是要求的解;如果root=p,且q在左右子树中,那么当前root就是要求的解;
if (lson and rson) or((lson or rson) and (root.val==p.val or root.val==q.val)):
self.ans=root