赞
踩
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 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 。
因为根据定义最近公共祖先节点可以为节点本身。示例 3:
输入:root = [1,2], p = 1, q = 2 输出:1提示:
- 树中节点数目在范围
[2, 105]
内。-109 <= Node.val <= 109
- 所有
Node.val
互不相同
。p != q
p
和q
均存在于给定的二叉树中。
- # 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
- time: O(n)
- space: 空间复杂度主要由递归栈决定。 O(n) / 完全平衡的 O(logn)
- """
-
- # 如果当前节点为空或者等于p或q,则直接返回
- if not root 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 not left:
- return right
- return left
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。