递归树的构建及所遇到的问题

目标:构建每层节点数目不定的树

所遇到的问题:

  1. 类TreeNode 可以单列出来,也可使和类Recursion_Tree的data部分融在一起。
  2. 子节点也要先构成一个小树,即childNode = Recursion_Tree(nodeItem),再插入到根节点(也就是这棵树上),不要直接向root插入nodeItem元素。
  3. 在向父节点中插入子节点时,遇到了父节点和子节点的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值