原題
給定一棵二叉樹,找到兩個節(jié)點的最近公共父節(jié)點(LCA)。
最近公共祖先是兩個節(jié)點的公共的祖先節(jié)點且具有最大深度忠聚。
對于下面這棵二叉樹
4
/ \
3 7
/ \
5 6
LCA(3, 5) = 4
LCA(5, 6) = 7
LCA(6, 7) = 7
解題思路
- Divide & Conquer 的思路
- 如果
root
為空钱慢,則返回空 - 如果
root
等于其中某個node
,則返回root
- 如果上述兩種情況都不滿足弧关,則divide,左右子樹分別調(diào)用該方法
- Divide & Conquer中治這一步要考慮清楚唤锉,本題三種情況
- 如果
left
和right
都有結(jié)果返回世囊,說明root是最小公共祖先 - 如果只有
left
有返回值,說明left
的返回值是最小公共祖先 - 如果只有?
right
有返回值窿祥,說明?right
的返回值是最小公共祖先
完整代碼
# 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
# divide
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
# conquer
if left != None and right != None:
return root
if left != None:
return left
else:
return right