原题
给定一棵平衡二叉树(BST),找到两个节点的最近公共父节点(LCA)。
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
对于下面这棵二叉树
4
/ \
3 7
/ \
5 6
LCA(3, 5) = 4
LCA(5, 6) = 7
LCA(6, 7) = 7
解题思路
- 与本题类似的题是把BST换成普通的二叉树,方法为divide & conquer
- 对于本题,初始如果root为空,则直接返回None
- 如果有其中一个node跟root相等,则返回root
- 以上两两种情况都不满足,考虑到是一棵平衡二叉树,所以有以下三种情况
- 如果两个node中的较小值都大于root.val,则答案一定在右子树
- 如果两个node中的较大值都小于root.val,则答案一定在左子树
- 或者root.val的值介于两个node的值中间,则返回root
完整代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
if not root:
return None
if root == p or root == q:
return root.val
if q.val > p.val:
q, p = p, q
if q.val < root.val and p.val > root.val:
return root.val
if q.val > root.val:
return self.lowestCommonAncestor(root.right, p, q)
if p.val < root.val:
return self.lowestCommonAncestor(root.left, p, q)