标签:
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
以下给出几个辅助理解的例子:
Lowest Common Ancestor of a Binary Tree
标签:
原文地址:http://www.cnblogs.com/sherylwang/p/5495540.html