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

使用树的根将树存储为字典

厉念
2023-03-14

我有一个根节点,具有属性数据、父节点和子节点(列表)。我想使用一种方法递归地将整个树存储在字典中。

treeNode类

class treeNode:
    is_leaf = True
    root = False
    
    def __init__(self,data):
        self.data = data
        self.parent = None
        self.children = []

    def __repr__(self):
        return f"{self.data}"
    
    def add_child(self,child):
        child.parent = self
        self.children.append(child)
        self.is_leaf = False
    
    def get_parent(self):
        if self.parent is not None:
            return self.parent
        else:
            self.root = True
            return None
    
    def get_children(self):
        if not self.is_leaf:
            return self.children
        else:
            print("This is a leaf")

    def set_frequency(self,freq):
        self.frequency = freq

    ##This is the method I want to use
    ## First input (node) is root
    def get_all_tree(self,node):       
        if node.is_leaf:
            children.append(node)
        else:
            for x in node.get_children():
                self.get_all_tree(x) 

我该如何实现这一点?

编辑:我想创建一个字典树,有点像这样:

{0:[1,{2:[11,12,13,16,{3:[14,15]},{4:[41,42,43]}]}

共有1个答案

凤财
2023-03-14
class treeNode:
...
    def get_all_tree(self, node):
        if node.is_leaf:
            return node
        else:
            tree = {node: []}
            for x in node.get_children():
                tree[node].append(x.get_all_tree(x))
            return tree

root = treeNode('0')
child1 = treeNode('1')
child2 = treeNode('2')
root.add_child(child1)
root.add_child(child2)
child1_1 = treeNode('1.1')
child1_2 = treeNode('1.2')
child1.add_child(child1_1)
child1.add_child(child1_2)
child1_1_1 = treeNode('1.1.1')
child1_1.add_child(child1_1_1)
print(root.get_all_tree(root))

这将返回{0:[{1:[{1.1:[1.1.1]},1.2]},2]}

我相信你的代码中还有一些改进,正如你所看到的,添加子元素是非常乏味的。考虑到类名为treeNode我相信您也有一个Tree类,我建议在Tree类中移动对子节点和父节点的处理,但将有关每个节点父节点/子节点的信息保留在treeNode类中。稍后我会尝试用一个简单的例子来解释它。

到目前为止,你的实施工作做得很好!

 类似资料:
  • 这个问题涵盖了一个软件算法 我正在解决亚马逊软件问题中的一个面试问题,特别是< br >“给定一组点(x,y)和一个整数“n”,返回n个接近原点的点” 下面是这个问题的高级伪代码示例答案,来自示例答案 步骤1:设计一个名为point的类,它有三个字段-int x,int y,int distance 第2步:对于所有给定的点,找到它们与原点之间的距离 第一步:将值存储在二叉树中 我同意步骤1和2,

  • 顺序存储二叉树是指用一个数组存储的二叉树,一般用于完全二叉树,物理上用数组存储逻辑上是一个树结构。 第n个元素的左节点索引2n+1 第n个元素的右节点索引2n+2 第n个元素的父节点为(n-1)/2 n为元素在数组中的索引 class Node(object): def __init__(self, data): self.data = data class Array

  • 尽管我们通常为每个四叉树定义一个容量,但我在网上找到的所有伪代码算法似乎都不太关心四叉树中的视觉点数。 当四叉树被分割时,有必要将其包含的点重新分布到其子树中吗? 我似乎无法正确实现这一点,维基百科四叉树的伪代码类别对此只有一条评论(但没有代码): 如果我们希望只有最后一个节点保存数据,我们必须将包含在这个四边形数组中的点/数据添加到新的四边形中

  • 上一节讲了 二叉树的顺序存储,通过学习你会发现,其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用 顺序表存储或多或多会存在空间浪费的现象。 本节我们学习二叉树的 链式存储结构。 图 1 普通二叉树示意图 如图 1 所示,此为一棵普通的二叉树,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用 链表存储即可。因此,图 1 对应的链式存储结构如图 2

  • 二叉树的存储结构有两种,分别为顺序存储和链式存储。本节先介绍 二叉树的顺序存储结构。 二叉树的顺序存储,指的是使用 顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以使用顺序表存储。 因此,如果我们想顺序存储普通二叉树,需要提前将普通二叉树转化为完全二叉树。 有读者会说,满二叉树也可以使用顺序存储。要知道,满二叉树也是完全二叉树,因为它满足完全二叉树

  • 主要内容:树的结点,子树和空树,结点的度和层次,有序树和无序树,森林,树的表示方法,总结之前介绍的所有的 数据结构都是 线性存储结构。本章所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。                                                                          (A)