【问题标题】:Python Checking paths to leaf in binary tree python giving data in the leafPython 检查二叉树中叶子的路径 python 在叶子中给出数据
【发布时间】:2018-06-11 18:52:23
【问题描述】:

假设我有这棵树:

                                     cough
                      Yes /                            \ No
                   sneezing                        sneezing
               Yes /       \ No                Yes /       \ No
             fever         fever               fever         fever
       Yes /    \ No    Yes/     \No       Yes /    \ No    Yes/     \No
       dead   cold   influenza   cold      dead   influenza cold   healthy

我想要通往疾病的道路"influenza" 输出应该是这样的:

[[True,False,True],[False,True,False]]

如果你去根的右边它返回 True (Yes),如果你去左边它的 False(No)

这是我一直试图为这个函数做的代码,但是我做错了它返回的不是我想要的..

def paths_to_illness(self, illness):

    head=self.__root
    new_list=[]
    new_list=diagnoser.get_path(head,illness)
    return new_list

def get_path(self,head,illness):

    if head is None:
        return []
    if (head.positive_child == None and head.negative_child==None):
        return [head.data]

    left_tree=diagnoser.get_path(head.negative_child,illness)
    right_tree=diagnoser.get_path(head.positive_child,illness)
    all_tree=left_tree+right_tree

    list1=[]

    for leaf in  all_tree:

        if illness == leaf:

            list1.append(["True"])
        else:
            list1.append(["False"])

    return list1

有什么想法可以帮助我修复我的代码吗?谢谢

对角线只是一个不重要的类,我的节点类右为"positive_child",左为"negative_child"

如果还有什么不清楚的地方请告诉我

谢谢!

根据要求我制作树的代码:

class Diagnoser:
def __init__(self, root):
    self.__root = root


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


leaf1 = Node("dead", None, None)
leaf2 = Node("cold", None, None)
fever1 = Node("fever", leaf1, leaf2)

leaf3 = Node("influenza", None, None)
leaf4 = Node("cold", None, None)
fever2 = Node("fever", leaf3, leaf4)

sneezing1 = Node("sneezing", fever1, fever2)

leaf5 = Node("dead", None, None)
leaf6 = Node("influenza", None, None)
fever3 = Node("fever", leaf5, leaf6)

leaf7 = Node("cold", None, None)
leaf8 = Node("healthy", None, None)
fever4 = Node("fever", leaf7, leaf8)

sneezing2 = Node("sneezing", fever3, fever4)

root = Node("cough", sneezing1, sneezing2)
diagnoser = Diagnoser(root)

【问题讨论】:

    标签: python list class binary-tree decision-tree


    【解决方案1】:

    这是我想出来的

    class Tree:
      def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right
    
      @property
      def is_leaf(self):
        return not (self.left or self.right)
    
      def __repr__(self):
        return 'Tree({}, {}, {})'.format(self.data, self.left, self.right)
    
      def find(self, target, path_to=()):
        if self.is_leaf:
          if self.data == target:
            yield path_to
        else:
          if self.left:
            yield from self.left.find(target, (*path_to, True))
          if self.right:
            yield from self.right.find(target, (*path_to, False))
    
    t = Tree('Cough', Tree('Sneezing', Tree('Fever', Tree('Dead'), Tree('Cold')), Tree('Fever', Tree('Influenza'), Tree('Cold'))), Tree('Sneezing', Tree('Fever', Tree('Dead'), Tree('Influenza')), Tree('Fever', Tree('Cold'), Tree('Healthy'))))
    
    print(list(t.find('Influenza')))
    

    通过让我们的find 方法成为一个生成器,我们可以使用yield from 轻松地在调用堆栈中冒泡积极的结果。如果您使用的 Python 版本不支持参数解包 (*path_to, True),则 path_to + (True,) 是等效的

    编辑:这是一个不使用yield的版本

    def find(self, target, path_to=()):
      if self.is_leaf:
        if self.data == target:
          return [path_to]
        else:
          return []
      else:
        if self.left:
          l = self.left.find(target, (*path_to, True))
        if self.right:
          r = self.right.find(target, (*path_to, False))
        return l + r
    

    【讨论】:

    • 感谢您的努力,我可以理解,通过您的代码,它应该可以按预期工作,但是我无法理解的是“产量”,因为我们在课堂上还没有学到这一点你能解释一下它在这里的作用吗?
    • @OdayHajYehia yield 将一个函数变成一个生成器,本质上允许它在执行的不同点返回多个值。这是一个不错的介绍性资源:wiki.python.org/moin/Generators
    • 啊,谢谢我现在明白了,虽然在我的课堂上不允许使用我们还没有学到的东西,但是谢谢,因为我们肯定会在接下来的讲座中很快学习它,因为现在我明白这很好,我认为我不能将其用作我的解决方案,但仍然感谢,因为它仍然比我尝试过的更好和更容易的解决方案,我想我从这个解决方案中得到了一个想法,使我的解决方案工作我会再次尝试感谢。
    猜你喜欢
    • 2022-01-26
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多