在 Python 中搜索任何树

Posted

技术标签:

【中文标题】在 Python 中搜索任何树【英文标题】:Searching any tree in 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 个元素的其他树或索引。我怎样才能使它适用于任何给定的树和索引?

【问题讨论】:

【参考方案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=[])])

【讨论】:

以上是关于在 Python 中搜索任何树的主要内容,如果未能解决你的问题,请参考以下文章

二叉搜索树迭代 java实现以及python实现

二叉搜索树迭代 java实现以及python实现

二叉搜索树迭代 java实现以及python实现

二叉搜索树迭代 java实现以及python实现

《剑指offer》---二叉搜索树与双向链表

二叉树的增删改查(Python)