【问题标题】:Searching any tree in Python在 Python 中搜索任何树
【发布时间】:2016-10-31 09:53:48
【问题描述】:

我需要在 Python 中编写一个函数,该函数接受树和索引并返回该索引处的子树或叶。

我尝试了循环和嵌套循环,直到我意识到必须运行测试的树总是相同的:

tree = (((1, 2), 3), (4, (5, 6)), 7, (8, 9, 10))

实际上是这样的:

Sample tree

所以我需要通过给定的测试是这样的:

def tree_ref(tree, index):
    if len(index) == 1:
        print tree[index[0]]
    elif len(index) == 2:
        print tree[index[0]][index[1]]
    elif len(index) == 3:
        print tree[index[0]][index[1]][index[2]]
    else:
        return False

例如,对于索引 = (1, 1, 0),它应该返回数字 5,并且确实如此。

但是,我知道此代码不适用于具有超过 3 个元素的其他树或索引。我怎样才能使它适用于任何给定的树和索引?

【问题讨论】:

    标签: python search tree artificial-intelligence


    【解决方案1】:

    你应该尝试使用递归。

    如下所示:

    def tree_ref(tree, index):
        if len(index) == 1:
            print tree[index[0]]
        else:
            tree_ref(tree[index[0]], index[1:])
    

    【讨论】:

    • 非常感谢,完美运行。应该首先考虑递归,是的。
    • @DanielSarmiento:如果它解决了您的问题,请验证答案;)
    【解决方案2】:

    看看这个:How can I implement a tree in Python? Are there any built in data structures in Python like in Java?

    您应该考虑将节点实现为链接文章中所述的类。如果您使用列表,您将很容易最终遇到您现在正在努力解决的问题。基于类的树不依赖于特定的形状或深度,并且更通用,更易于实现和搜索。

    汉努

    【讨论】:

      【解决方案3】:

      在我看来itertree 包(我是作者)为这个问题提供了一个很好的解决方案。

      首先我们构建一个表示给定元组结构的树:

      >>>from itertree import *
      >>>root=iTree('root')
      >>># we must use some helper tags ("sub","sub2","sub3") to fill the tree
      >>>root += iTree('sub')
      >>>root += iTree('sub')
      >>>root += iTree('sub',data=7)
      >>>root += iTree('sub')
      >>>root[0] += iTree('sub2')
      >>>root[0][0] += iTree('sub3', data=1)
      >>>root[0][0] += iTree('sub3', data=2)
      >>>root[0] += iTree('sub2', data=3)
      >>>
      >>>root[1] += iTree('sub2', data=4)
      >>>root[1] += iTree('sub2')
      >>>root[1][0] += iTree('sub3', data=5)
      >>>root[1][0] += iTree('sub3', data=6)
      >>>
      >>>root[3] += iTree('sub2', data=8)
      >>>root[3] += iTree('sub2', data=9)
      >>>root[3] += iTree('sub2', data=10)
      

      树的内容如下所示:

      >>>root.render()
      iTree('root')
           └──iTree('sub')
               └──iTree('sub2')
                   └──iTree('sub3', data=1)
                   └──iTree('sub3', data=2)
               └──iTree('sub2', data=3)
           └──iTree('sub')
               └──iTree('sub2', data=4)
                   └──iTree('sub3', data=5)
                   └──iTree('sub3', data=6)
               └──iTree('sub2')
           └──iTree('sub', data=7)
           └──iTree('sub')
           └──iTree('sub2', data=8)
           └──iTree('sub2', data=9)
           └──iTree('sub2', data=10)
      

      现在可以通过索引访问项目:

      >>>print(root[0][0][0].d_get())
      1
      >>># or
      >>>print(root.get_deep([1, 0, 1]).d_get())
      6
      

      项目本身也知道他的索引路径:

      >>>print(root.get_deep([0,0,1]).idx_path)
      [0, 0, 1]
      

      对数据内容的过滤访问也是可能的:

      >>>item_filter=Filter.iTFilterData(data_value=iTInterval(2,5))
      >>>for i in root.iter_all(item_filter):
      >>>    print(i)
      iTree("'sub2'", data=3, subtree=[])
      iTree("'sub2'", data=4, subtree=[iTree("'sub3'", data=5, subtree=[]), iTree("'sub3'", data=6, subtree=[])])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 2011-03-04
        • 2021-02-20
        相关资源
        最近更新 更多