目标:构建每层节点数目不定的树
所遇到的问题:
- 类TreeNode 可以单列出来,也可使和类Recursion_Tree的data部分融在一起。
- 子节点也要先构成一个小树,即childNode = Recursion_Tree(nodeItem),再插入到根节点(也就是这棵树上),不要直接向root插入nodeItem元素。
- 在向父节点中插入子节点时,遇到了父节点和子节点的children数组都被嵌套了无数层待插入子节点的情况。
解决方法:Recursion_Tree中的list数组 children要定义成深拷贝的形式:即self.children = copy.deepcopy(children)。否则实例化出来的所有对象(比如root, childNode)的children都指向同一个地址,在self.children.append(child)时会导致所有节点的children都 被添加了同样的元素。
4. 找父节点位置时, 要递归查找每一层,所以要用当前实例调用类中函数,即:children_node.isSubNode(child) 、 children_node.insertSubNode(child),这样self 才是下一层节点children_node,否则self一直是root节点。
下面是正确无误的版本:
'''
将所有部件用递归树组织起来。
原理:计算每个部件的bbox和体积,根据体积倒序排列,依次插入到树上。
树上的每个节点node包含两个信息:
data:
--componentName
--bbox
--volume
--label
children:
-- [childNode1, ...]
root作为根节点,是所有部件的外包围盒,体积为包围盒对应的体积,name 为'building', label 为'building'。
'''
class TreeNode:
def __init__(self,component_name, bbox, volume, label):
self.component_name = component_name
self.bbox = bbox
self.volume = volume
self.label = label
class Recursion_Tree:
def __init__(self, data:TreeNode, children:list = []):
self.data = data
self.children = copy.deepcopy(children) #### 深拷贝!!!,否则所有节点的children指向同一个地址
def insertSubNode(self, child):
flag = -1
if len(self.children) == 0: ##如果无儿子,当前节点就是所求父节点,插入新的节点
self.children.append(child)
return
for children_node in self.children: #如果有儿子,就计入下一层判断儿子中是否有满足条件的节点
if children_node.isSubNode(child):
children_node.insertSubNode(child)
flag = 1
break
if flag == -1:
self.children.append(child)
if __name__ == "__main__":
#创建根节点
nodeItem = TreeNode(component_name, bbox, volume, label)
root = Recursion_Tree(nodeItem)
#插入子节点
nodeItem = TreeNode(component_name, bbox, volume, label)
childNode = Recursion_Tree(nodeItem)
root.insertSubNode(childNode)
结果显示:
部件检测结果:
递归树构建结果:
递归树的显示:
https://blog.csdn.net/qq_24505417/article/details/117627973?spm=1001.2014.3001.5501