Python 遍历BST的元素

Python 遍历BST的元素,python,python-2.7,binary-search-tree,Python,Python 2.7,Binary Search Tree,我有一个二进制搜索树,其节点存储在python字典中。以下是一个例子: BST = {'node1': ['Fail', 'node3'], 'node3': ['Fail', 'Pass'], 'node2': ['Fail', 'node1'], 'node4': ['Fail', 'node2']} 在字典中,每个键都是BST中的父项,列表(键的值)是该父项的子项以及字典中相应的键 例如: BST['node1'] = ['Fail', 'node3'] 在这种情况下,'node1'

我有一个二进制搜索树,其节点存储在python字典中。以下是一个例子:

BST = {'node1': ['Fail', 'node3'], 'node3': ['Fail', 'Pass'], 'node2': ['Fail', 'node1'], 'node4': ['Fail', 'node2']}
在字典中,每个键都是BST中的父项,列表(键的值)是该父项的子项以及字典中相应的键

例如:

BST['node1'] =  ['Fail', 'node3']
在这种情况下,
'node1'
是子节点的父节点
['Fail',node3]
。列表的第一个元素
'Fail'
'node1'
的左子元素,而该列表的另一个元素
'node3'
'node1'
的右子元素

左侧子对象与其父对象之间的边的值为“是”,右侧子对象与其父对象之间的边的值为“否”

Fail
Pass
值是BST的叶子

一是观察,要能找到根;只需选择一个节点并检查它是否有父节点。如果不是,它就是树的根。否则,请与该节点的父节点检查相同的内容

以下是字典对应的树:

我认为这棵树的构造是清楚的。现在关于我的问题,我需要以
FAIL
节点作为其最终节点并以yes边开始的格式找到路径。如果第一个节点没有“是”边,只需将其删除并查找下一个节点,直到找到“是”边作为该路径的起点

示例:

在此BST中,有效路径应为:

[[node4,yes], [node1, yes], [node3, yes], FAIL]
[[node4,yes], [node1, no], FAIL]]
[[node2,yes], FAIL]
[[node1,yes], FAIL]
[[node3,yes], FAIL]
注意:如果找到路径,则无需查看其子路径。例如,这是无效的,因为有更长的路径覆盖此路径:

[[node4,yes], [node3, yes], FAIL].
即:

[[node4,yes], [node1, yes], [node3, yes], FAIL]

字典实现树很难看
, 而是使用自引用结构
类节点
,如下所述

class Node:
    """Referential Structure used to create new nodes"""
    def __init__(self, data):
        """Constructor."""
        self.data = data
        self.left = None
        self.right = None
这将使您的遍历更加容易


请参考:

到目前为止,您有什么代码?您的示例内容让我困惑。。。为什么node1,是直接导致失败?是否应该是node1,否->失败?在这种情况下,如果该节点存在,则会导致失败。为什么不呢?事实上,我不擅长递归函数。我写了很多东西然后删除了它们。node1,是的,似乎转到了node3,没有失败。。。不过没关系,你说得对,我也不喜欢用字典。我将尝试此方法。尽管您希望向node类添加一些方法。。。如果它只是数据成员,那么类很少是正确的选择,但是如果你想将数据成员和操作结合起来,那么它几乎总是正确的选择。我在这个类中编写了一些方法,效果很好。