麻烦递归地构建二元决策树python

时间:2018-01-07 06:27:53

标签: python algorithm recursion tree binary-tree

我正在尝试递归地构建一个二元决策树,用于诊断python 3中的疾病。 构建器记录了一系列记录(每个记录都是疾病及其症状列表),以及一系列症状,如下所示:

class Node:
    def __init__(self, data = "", pos = None, neg = None):
        self.data = data
        self.positive_child = pos
        self.negative_child = neg
class Record:
    def __init__(self, illness, symptoms):
        self.illness = illness
        self.symptoms = symptoms

records= [Record('A',['1','3']),
          Record('B',['1','2']),
          Record('C',['2','3']),
          ]
symptoms = ['1','2','3']

构建二叉树,每个级别检查症状是否为true,或者为false,每个级别都有一个子节点。正确的孩子总是意味着symtom不存在,而左边的则存在。对于示例数据,树应如下所示:

                       1
               2                    2
          3        3          3            3
    None   B     A   None   C  None   None     Healthy

例如,通过询问到达叶子A: 1:是的 2:错 3:是的 它的路径是[1,3](真实)

以下是我正在使用的代码,但无效:

def builder(records, symptoms, path):
    #Chekl if we are in a leaf node that matches an illness
    for record in records:
        if path == record.symptoms:
            return Node(record.illness,None,None)

     #No more symptoms means an empty leaf node
    if len(symptoms) == 0:
        return Node(None,None,None)

    #create subtree
    else:
        symptom = symptoms.pop(0)
        right_child = builder(records,symptoms,path)
        path.append(symptom)
        left_child = builder(records,symptoms,path)
        return  Node(symptom,right_child,left_child)

我试了一下冷,用纸做的很好。我不确定我缺少什么,但结果树有很多空节点,而不是有病的人。也许我搞砸了路径,但我现在还不确定如何修复它。

1 个答案:

答案 0 :(得分:1)

您的symptoms.pop(0)影响了symptoms所有来电共享的一个 builder列表。这样下去很好,因为你只想考虑后续症状。但是当递归调用返回时,您的列表缺少元素。 (如果它没有找到匹配就返回,它就是空的!)同样,共享的path会一直在增长。

简单但效率低下的答案是在递归时创建新列表:

symptom=symptoms[0]
symptoms=symptoms[1:]
path=path+[symptom]  # not +=