【问题标题】:Traversing the elements of BST遍历 BST 的元素
【发布时间】:2013-11-07 16:38:00
【问题描述】:

我有一个二叉搜索树,其节点存储在 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' 的右子元素。

左孩子与其父母之间的边值为“是”,右孩子与其父母之间的边缘值为“否”。

FailPass 值是 BST 的叶子。

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

这是与字典对应的树:

我认为树的结构很清楚。现在关于我的问题,我需要以将FAIL 节点作为其最终节点并以yes 边缘开始的格式找到路径。如果第一个节点没有yes边缘,则将其消除并寻找下一个,直到找到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]

【问题讨论】:

  • 到目前为止你有什么代码?
  • 你的例子让我很困惑......为什么 node1,yes 直接导致失败?不应该是 node1,no -> 失败吗?
  • 在这种情况下,如果该节点存在,那么它会导致失败。为什么不应该呢?
  • 其实我并不擅长递归函数。我写了很多东西然后删除了它们。
  • node1,yes 似乎转到 node3,不会失败...但是 node1,no 会失败

标签: python python-2.7 binary-search-tree


【解决方案1】:

Dictionaries 实现 Tree 很丑, 而是使用下面提到的自引用结构class Node

class Node:
    """Referential Structure used to create new nodes"""
    def __init__(self, data):
        """Constructor."""
        self.data = data
        self.left = None
        self.right = None

这将使您的遍历更容易

请参考:https://github.com/SivaCn/Small-Codes/blob/master/Python/BinarySearchTree.py

【讨论】:

  • 你说得对,我也不喜欢用字典。我会试试这个方法。
  • 虽然您想向节点类添加一些方法......如果它只是数据成员,那么一个类很少是正确的选择,但是如果您想组合数据,它几乎总是正确的选择成员和行动
  • 我在那个类中写了一些方法,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多