Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
For example, the lowest common ancestor (LCA) of nodes 5
and 1
is 3
. Another example is LCA of nodes 5
and 4
is 5
, since a node can be a descendant of itself according to the LCA definition.
一道middle的binary tree的题目,在我的眼里不是非常简单,思路devide and conquer。即不断递归向下,找寻最低公共结点,如果某结点的左右的子树分别包括node1或者node2,则返回该结点。否则如果左子树中包括node1或者node2中的一个,则返回被命中的node,右结点也是。如果左右都没有,或者结点为空,则返回None.该题结点不会有重复,所以不同的结点不会同时等于node1或者node2。
另外一值得注意的地方是,如果要寻找的两个结点,其中一个结点为另外一个结点的子结点,则找到为母结点的那个结点就可以返回,毕竟结点相等,意味着该结点的左右子树也完全相等,即包含着那个子结点,因为程序递归向下,所以最终最终返回的是为母结点的那个点。最差情况下所有结点都需要遍历一遍,每个结点的处理时间为O(1),所以最坏的时间复杂度为O(n),平均时间复杂度为O(n)。空间复杂度为递归栈的大小,为O(logn)
代码如下:
class Solution(object): def lowestCommonAncestor(self, root, p, q): """ :type root: TreeNode :type p: TreeNode :type q: TreeNode :rtype: TreeNode """
#在root为根的二叉树中找A,B的LCA: #如果找到了就返回这个LCA #如果只碰到A,就返回A #如果只碰到B,就返回B #如果都没有,就返回None
if root in (None,p,q): #node为空则返回空,node等于p或者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 if right: return right return None #左右结点都不包含要寻找的结点,且该结点本身也不是,则返回None
以下给出几个辅助理解的例子:
左边为找5,4的LCA,右边为找4,8的LCA。