【问题标题】:building a tree in python在python中构建一棵树
【发布时间】:2020-04-29 11:26:27
【问题描述】:

我试图根据给定的元素列表构建一棵树,其中每个元素构成一个整体。 element0 是根,然后 element1 是第一级,依此类推。

这是我的代码:

example: for a given list ["fever", "headache", "fatigue"] my tree would be:
                    fever
    #          Yes /       \ No
    #        headache           headache
    #   Yes /     \ No     Yes/     \No
    #     fatigue   fatigue  fatigue fatigue 
class Node:
    def __init__(self, data, positive_child = None, negative_child = None):
        self.data = data
        self.positive_child = positive_child
        self.negative_child = negative_child
    def __str__(self):
        return str(self.data)

def tree_helper(symptoms,tree_nodes):
    if len(symptoms) == 0:
        return
    if len(symptoms) == 1:
        symptoms[0] = Node(symptoms[0])
        tree_nodes.append(symptoms[0])
        print('OK')
    else:
        yes_root = Node(symptoms[0],symptoms[1],symptoms[1])

        tree_nodes.append((yes_root))
        tree_helper(symptoms[1:],tree_nodes)
        no_root = Node(symptoms[0],symptoms[1],symptoms[1])
        tree_nodes.append(no_root)
        tree_helper(symptoms[1:],tree_nodes)
        return tree_nodes

def build_tree(symptoms):
    tree_nodes = []
    if len(symptoms) > 1:
        tree_nodes = tree_helper(symptoms,tree_nodes)
    for i in tree_nodes:
        print(i.data, i.positive_child,i.negative_child)

if __name__ == "__main__":
    build_tree(["fever","headache","fatigue"])

它似乎只制作最左边路径和最右边路径的节点,并将它们添加两次。

【问题讨论】:

  • tree_helperelse 部分中,您复制了yes 和no 路径。尝试找出这些路径之间的区别以应用于您的树。

标签: python build tree


【解决方案1】:

您可以构建节点,然后添加连接。

# each layer has 2^i nodes for i = 0,1,2..
nodes = [[Node(s) for _ in range(pow(2,i))] for i,s in enumerate(s)]

# add connections
for i in range(len(nodes)-1):
    for parent in nodes[i]:
        parent.positive_child = nodes[i+1][2*i]
        parent.negative_child = nodes[i+1][2*i + 1]


tree = nodes[0][0]

【讨论】:

  • 你能解释一下第一行吗,我对一个循环的衬里不太熟悉,'s'代表什么?
  • 第一行构建了一个列表列表,其中每个列表包含给定层中的所有节点。
猜你喜欢
  • 1970-01-01
  • 2014-11-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多