当前位置: 首页 > 知识库问答 >
问题:

递归树项搜索

师向文
2023-03-14

我有嵌套父子项的QTreeWidget

Tree:
    parent1:
           childA1
           childA2
           childA3:
                  childB1
                  childB2:
                         childC1

使用:

    allItems=[]
    for i in range(Tree.topLevelItemCount()):
        item=Tree.topLevelItem(i)
        allItems.add(item)

我访问第一级项目“A”:childA1、childA2和childA3

现在,我迭代每个第一级“A”项来访问他们的孩子——第二级项目“B”:

    for i in range(Tree.topLevelItemCount()):
        item=Tree.topLevelItem(i)

        for m in range(item.childCount()):
            childItem=item.child(m)
            allItems.add(childItem)

在第二个层次,我不知道下面是否有任何第三个层次的项目“C”。如何确保函数向下推进,因为下面有嵌套的项目,将项目添加到allItem列表中,直到它到达末尾?

共有2个答案

凌照
2023-03-14

下面的代码使用嵌套项创建QTreeWidget

Tree的getItemsRecurely()方法扫描Tree,直到它到达底部项,返回Tree中所有项的列表。

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Tree(QtGui.QTreeWidget):
    def __init__(self, *args, **kwargs):
        super(Tree, self).__init__()
        for name in ['Item_A0', 'Item_A1', 'Item_A2']: 
            itemA=QtGui.QTreeWidgetItem([name])

            self.addTopLevelItem(itemA)
            if name=='Item_A1':
                item_B0=QtGui.QTreeWidgetItem(['Item_B0'])
                itemA.insertChild(0, item_B0)
                itemA.insertChild(1, QtGui.QTreeWidgetItem(['Item_B1']))

                item_C0=QtGui.QTreeWidgetItem(['Item_C0'])
                item_B0.insertChild(0, item_C0)
                item_B0.insertChild(0, QtGui.QTreeWidgetItem(['Item_C1']))

        self.resize(360,240)
        self.show()

    def getItemsRecursively(self):
        total=[]
        def serchChildItem(item=None):
            if not item: return
            for m in range(item.childCount()): 
                childItem=item.child(m)                
                if not childItem: continue
                total.append(childItem)   
                serchChildItem(childItem)

        for i in range(self.topLevelItemCount()):
            item=self.topLevelItem(i)
            if not item: continue
            total.append(item)
            serchChildItem(item)
        return total

tree=Tree()
total=tree.getItemsRecursively()
print 'Total number of Tree items: %s'%len(total)
sys.exit(app.exec_())
漆雕唯
2023-03-14

您最好使用递归实现,尤其是在您的情况下,对递归深度的要求似乎很低。

如果树的高度超过1000,请注意Python有一个默认的递归限制[可以通过sys.setrecursionlimit(limit)设置限制来覆盖该限制,尽管不鼓励这样做,因为CPython(Python的默认实现)不会优化深度递归,因此也不会优化默认限制]

对于这种递归实现,有很多指南。因此,这里的问题可以根据您的具体应用进行修改。

如果你想要一个非递归的实现,下面的方法可以适用于你的情况[请注意,我还没有测试过同样的方法]。这只是为了让你得到一个想法。

allItems=[]
buff = []

# Populating the buffer with all the top level items
for i in range(Tree.topLevelItemCount()):
    item=Tree.topLevelItem(i)
    buff.append(item)

while len(buff) > 0:
    # Take the first item out of the buffer by popping it
    current_item = buff.pop(buff[0])

    # Put all the childs of current_item in the buffer
    for child_no in range(current_item.childCount):
        buff.append(current_item.child(child_no))

    # Append the current_item to the allItems list
    allItems.append(current_item)
 类似资料:
  • 我试图为我的BST做一个递归加法。public add方法接受一个int参数,private方法接受相同的int和一个节点。这是我目前掌握的代码 我经常得到空指针,也尝试过调试,但我的逻辑中有一些我看不到的缺陷。

  • 这是作业,不要贴代码。求你了,谢谢你。 我被指派创建一个计算BST中特定的深度的方法。 为此,我需要a方法。因此,要递归地找到它,我需要创建一个助手方法。 我知道我需要在树中搜索包含我要查找的数据的节点。为此,我编写了以下代码: 然而,这是行不通的,因为每次进行递归调用时,将保持;本质上,它是在重置深度值。我不知道如何在调用之间保持的值。

  • 首先,这是家庭作业,所以把它放在外面。 我应该用特定的方法实现二叉查找树: void insert(字符串)、boolean remove(字符串)和boolean find(字符串)。 我已经能够成功地编程和测试插入,并找到方法,但我有困难与删除。 我的程序中发生的事情是,删除实际上并没有从树中删除任何东西,我相信这是因为它只引用当前节点的本地创建,但我可能错了。我认为我可以实现我需要测试的不同

  • 我试图验证二叉查找树。给定二叉树的根,确定它是否是有效的二叉查找树(BST)。 有效的BST定义如下: 节点的左子树只包含键小于节点键的节点。节点的右子树只包含键大于节点键的节点。左子树和右子树也必须是二叉搜索树。 https://leetcode.com/problems/validate-binary-search-tree/ 我正在使用递归解决方案,但它未能通过以下测试用例: 输入:[2,1

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 从二叉查找树中删除节点时,您可以将节点替换为左侧的最大子节点或右侧的最小子节点。 我很难理解以下实现执行删除操作的方式。 上面的代码包括以下步骤: < li >查找替换节点。 < li >让替换节点引用已删除节点的左右子节点。 < li >让已删除节点的左右子节点将替换节点作为父节点。 < li >让替换节点引用已删除节点的父节点作为自己的父节点。 < li >清理。 我有困难的部分特别是递归。据