用Python实现树形结构的递归算法
假设我们有一个树形结构的数据,每个节点包含一个唯一的ID和一个父节点ID,我们需要将这些数据转化为树形结构的形式,并实现递归算法。
首先,我们可以定义一个节点类来表示每个节点:
class Node: def __init__(self, id, parent_id, value): self.id = id self.parent_id = parent_id self.value = value self.children = []
其中,id和parent_id表示节点的唯一ID和父节点ID,value表示节点的值,children表示节点的子节点列表。
接下来,我们使用一个列表来存储所有节点数据,并编写一个函数来将这些数据转化为树形结构:
def build_tree(nodes): # 存储节点ID和节点对象的映射关系 mapping = {node.id: Node(node.id, node.parent_id, node.value) for node in nodes} # 添加子节点 for node in mapping.values(): if node.parent_id in mapping: mapping[node.parent_id].children.append(node) # 找出树的根节点 roots = [node for node in mapping.values() if not node.parent_id] # 如果有多个根节点,将它们合并为一个虚拟节点 if len(roots) > 1: root = Node(None, None, None) root.children = roots return root elif roots: return roots[0] else: return None
这个函数接受一个节点列表作为参数,将节点数据转化为树形结构。首先,我们使用一个字典来存储节点ID和节点对象的映射关系。然后,遍历节点列表,为每个节点添加子节点,最后找出根节点并返回。
最后,我们可以编写一个递归算法来遍历整颗树,例如打印所有节点的值:
def traverse(node): print(node.value) for child in node.children: traverse(child)
完整代码如下所示:
class Node: def __init__(self, id, parent_id, value): self.id = id self.parent_id = parent_id self.value = value self.children = [] def build_tree(nodes): # 存储节点ID和节点对象的映射关系 mapping = {node.id: Node(node.id, node.parent_id, node.value) for node in nodes} # 添加子节点 for node in mapping.values(): if node.parent_id in mapping: mapping[node.parent_id].children.append(node) # 找出树的根节点 roots = [node for node in mapping.values() if not node.parent_id] # 如果有多个根节点,将它们合并为一个虚拟节点 if len(roots) > 1: root = Node(None, None, None) root.children = roots return root elif roots: return roots[0] else: return None def traverse(node): print(node.value) for child in node.children: traverse(child) nodes = [ {'id': 1, 'parent_id': None, 'value': 'a'}, {'id': 2, 'parent_id': 1, 'value': 'b'}, {'id': 3, 'parent_id': 1, 'value': 'c'}, {'id': 4, 'parent_id': 2, 'value': 'd'}, {'id': 5, 'parent_id': 4, 'value': 'e'}, {'id': 6, 'parent_id': 2, 'value': 'f'}, {'id': 7, 'parent_id': 3, 'value': 'g'}, ] tree = build_tree(nodes) traverse(tree)
相关文章