我有嵌套父子项的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
列表中,直到它到达末尾?
下面的代码使用嵌套项创建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_())
您最好使用递归实现,尤其是在您的情况下,对递归深度的要求似乎很低。
如果树的高度超过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 >清理。 我有困难的部分特别是递归。据