搜索 Python 中的任何树

Searching any tree in Python

我需要在 Python 中编写一个函数,它接受一棵树和一个索引,并且 return 是该索引处的子树或叶。

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

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),它应该 return 数字 5,它确实如此。

但是,我知道此代码不适用于其他树或包含 3 个以上元素的索引。我怎样才能让它适用于任何给定的树和索引?

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

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

汉奴

你应该尝试使用递归。

如下所示:

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

在我看来 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=[])])