LeetCode|LeetCode——二叉树/二叉搜索树的公共祖先

235.二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

_______6______ /\ ___2_____8__

/ \ /
0 _4 7 9
/
3 5
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉搜索树中。
思路:二叉搜索树稍微简单些,因为左子树上的所有节点的值都要小于它的根节点的值,右子树上所有节点的值均大于它根节点的值。
【LeetCode|LeetCode——二叉树/二叉搜索树的公共祖先】所以直接比较即可
class Solution: def lowestCommonAncestor(self, root, p, q): """ :type root: TreeNode :type p: TreeNode :type q: TreeNode :rtype: TreeNode """ if p.val < root.val > q.val: return self.lowestCommonAncestor(root.left, p, q) if p.val > root.val < q.val: return self.lowestCommonAncestor(root.right, p, q) return root

236.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
_______3______ /\ ___5_____1__

/ \ /
6 _2 0 8
/
7 4
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
思路::LCA(最近公共父节点)问题是二叉树里很经典的问题了,若是树的结构中有parent指针的话那这一题就很容易了,若没有的话就需要想一想了。
依然用到了分治法的思想,想一想,若是对于一个树结点,在左子树中找到了A,在右子树中找到了B,那说明此结点是公共节点
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass Solution: def lowestCommonAncestor(self, root, p, q): """ :type root: TreeNode :type p: TreeNode :type q: TreeNode :rtype: TreeNode """if(root is None or root==p or root==q): return root#若root为空或者root为A或者root为B,说明找到了A和B其中一个 left=self.lowestCommonAncestor(root.left,p,q) right=self.lowestCommonAncestor(root.right,p,q) if(left is not None and right is not None): return root#若左子树找到了p,右子树找到了q,说明此时的root就是公共祖先 if(left is None):#若左子树是none右子树不是,说明右子树找到了p或q return right if(right is None):#同理 return left return None

    推荐阅读