这节课讲最近公共祖先的两道题
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
236 题解
分情况讨论
- 如果root 为空,当前节点为p, 当前节点为q 返回 当前节点。
- 左右子树中都能找到,返回当前节点。
- 只有左子树中可以找到,返回左子树的结果。
- 只有右子树可以找到,返回右子树的结果。
看代码
# 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 is None or root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right :
return root
if left :
return left
return right
这题同样的,可以利用二叉搜索树的性质,左子树的节点值都小于当前节点,右子树的节点值都大于当前节点。
这个题和上题一样
直接看代码吧
# 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 is None or root == p or root == q:
return root
if root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q )
return root
系列文章
- 三数之和 - 灵神视频总结。-CSDN博客
- 盛最多水的容器 接雨水 - 灵神视频总结-CSDN博客
- 滑动窗口 模版 - 灵神视频总结-CSDN博客
- 二分查找 红蓝染色法 - 灵神视频总结-CSDN博客
- 二分查找 数组峰值 旋转排序数组 - 灵神视频总结-CSDN博客
- 反转链表 K个一组反转链表 - 灵神视频总结-CSDN博客
- 环形链表 快慢指针 奇偶链表 重排链表 -- 灵神视频总结-CSDN博客
- 删除链表重复节点 - 灵神视频总结-CSDN博客
- 看到递归就晕?带你理解递归的本质!-- 灵神视频总结-CSDN博客
- 如何灵活运用递归?- 灵神视频总结-CSDN博客