使用Python实现树形结构的最近公共祖先算法
树形结构的最近公共祖先(LCA)算法可以通过以下步骤来实现:
- 构建树形数据结构:使用字典来存储树形结构,字典的键表示节点的ID,值是一个列表,列表中包含其所有子节点的ID。
- 查找节点的祖先:从给定节点的ID开始,一直迭代到根节点,记录经过的路径上的所有节点ID,保存到一个列表中。
- 查找两个节点的最近公共祖先:从两个节点的祖先列表的末尾开始比较,找到最后一个相同的节点ID,即为两个节点的LCA。
下面是Python代码实现:
tree = { "A": ["B", "C"], "B": ["D", "E"], "C": ["F"], "D": ["G"], "E": ["H", "I"], "F": ["J"], "G": [], "H": [], "I": [], "J": [] } def find_ancestors(tree, node): ancestors = [] while node in tree: parent = None for key in tree: if node in tree[key]: parent = key break if parent is None: break ancestors.append(parent) node = parent return ancestors def find_lca(tree, node1, node2): ancestors1 = find_ancestors(tree, node1) ancestors2 = find_ancestors(tree, node2) lca = None while ancestors1 and ancestors2: if ancestors1[-1] == ancestors2[-1]: lca = ancestors1[-1] ancestors1.pop() ancestors2.pop() return lca # 测试 print(find_lca(tree, "H", "I")) # B print(find_lca(tree, "G", "J")) # A print(find_lca(tree, "D", "F")) # A
这段代码实现了一个简单的树形结构的LCA算法,使用了一个树形结构的字典来表示树,并且假设根节点的父节点为None。在这个树中,节点B是节点H和I的最近公共祖先,节点A是节点G和J的最近公共祖先,节点A也是节点D和F的最近公共祖先。
相关文章