Data structures 给出了寻找两个节点共同祖先的算法

Data structures 给出了寻找两个节点共同祖先的算法,data-structures,tree,Data Structures,Tree,若给我两个节点和树的根。如何找到两个节点的共同祖先?您可以采用这种方法 当从上到下遍历二叉搜索树时,我们遇到的第一个节点n的值介于n1和n2之间,即n1

若给我两个节点和树的根。如何找到两个节点的共同祖先?

您可以采用这种方法 当从上到下遍历二叉搜索树时,我们遇到的第一个节点n的值介于n1和n2之间,即n1
这是采访中经常问到的编程问题,您可以很容易地在

上找到它的解决方案。嗨,这是一个我发现对LCA有用的python实现:-

class BST(object):
def __init__(self, val=None, right=None, left=None):
    self.val = val
    self.right = right
    self.left = left
    return None

def __nonzero__(self):
    return self.val is not None

def insert(self, item):
    if not self:
        self.val = item
    elif item < self.val:
        if self.left:
            return self.left.insert(item)
        else:
            self.left = BST(val=item)
    elif item > self.val:
        if self.right:
            return self.right.insert(item)
        else:
            self.right = BST(val=item)
    return None

def lca(self, m, n):
    if n < self.val:
        return self.left.lca(m, n)
    elif m > self.val:
        return self.right.lca(m, n)
    else:
        return self.val


if __name__ == "__main__":
b = BST()
for k in [8, 3, 10, 1, 6, 14, 4, 7, 13]:
    b.insert(k)
for pair in [(4, 7), (4, 10), (1, 4), (1, 3), (3, 6)]:
    print b.lca(*pair)
类BST(对象):
定义初始化(self,val=None,right=None,left=None):
self.val=val
self.right=right
self.left=左
一无所获
定义非零(自):
return self.val不是None
def插件(自身,项目):
如果不是自己:
self.val=项目
elif项目self.val:
如果你是对的:
返回self.right.insert(项目)
其他:
self.right=BST(val=item)
一无所获
def lca(自身、m、n):
如果nself.val:
返回self.right.lca(m,n)
其他:
返回self.val
如果名称=“\uuuuu main\uuuuuuuu”:
b=BST()
对于[8,3,10,1,6,14,4,7,13]中的k:
b、 插入(k)
对于[(4,7)、(4,10)、(1,4)、(1,3)、(3,6)]中的一对:
打印b.lca(*对)
可能的副本请参见此处: