【问题标题】:Recursivly print Mtree-structure in Python在 Python 中递归打印树结构
【发布时间】:2022-09-27 21:38:32
【问题描述】:

我正在努力以视觉方式从 Mtree 打印数据,更具体地说是这个 mtree https://github.com/tburette/mtree

我在这里有一个距离函数:

def d_int(x, y):
    return abs(x - y)

我在这里创建并填充 MTree

p_tree = mtree.MTree(d_int, max_node_size=2)
p_tree.add_all([1,2,6,5,0,24,19,11,80,31,32,3,4,16,71,89,9,10])

p_tree.__dict__ 看起来像这样: 一个根有两个条目(存储在一个集合中),但没有第一个节点。然后这两个条目中的每一个都包含子树,依此类推

{\'d\': <function _main_.d_int(x, y)>,
 (... left out data ...)
 \'size\': 18,
 \'root\': InternalNode(parent_node: None, parent_entry: None, 
  entries:[
  Entry(obj: 24, dist: None, radius: 65, subtree: \'InternalNode()\'), 
  Entry(obj: 1, dist: None, radius: 10, subtree: \'InternalNode()\')
  ])}

我一直试图通过像这样递归循环子树来打印树,但我最终得到了一个对我没有意义的打印。

def printTree(root, level=0):
    
    print(\"  \" * level, root.obj)

   if(root.subtree == None): return root.obj
    
    for child in root.subtree.entries:
        printTree(child, level + 1)
printTree(p_tree.root.entries.pop()) //pop() because entries is a set

返回

0
   11
     11
       11
         11
           11
11
           10
10
   0
     3
       3
         3
           4
4
           3
3
       6
         6
           6
6
           5
5
         9
           9
9
     0
       0
         1
           1
1
           2
2
         0
           0
0

我也不想为了打印它而破坏我的树(pop()),但是当根节点不是它自己的节点时,我看不到其他方法。

** 所以我的问题: 如何打印 Mtree? (更具体地说是https://github.com/tburette/mtree) 以及如何在没有顶部节点的情况下递归打印树? **

  • 关于pop:How to retrieve an element from a set without removing it?。一种方法是printTree(next(iter(p_tree.root.entries)))
  • 您是否直接尝试过print(p_tree.root)?
  • print(p_tree.root) 将dict关系中的信息返回给root,即:`\'root\': InternalNode(parent_node: None, parent_entry: None, entries:[Entry(obj: 24, dist: None, radius: 65, subtree : \'InternalNode()\'), Entry(obj: 1, dist: None, radius: 10, subtree: \'InternalNode()\')])} `
  • @Stef printTree(next(iter(p_tree.root.entries))) - 太棒了!谢谢,这就是我一半麻烦的答案!
  • 好的,def tree_as_tuple(root): return (root.obj, tuple(map(tree_as_tuple, root.subtree.entries))) 怎么样;然后你用print(tree_as_tuple(p_tree.root))打印

标签: python loops recursion printing


【解决方案1】:
def tree_as_tuple(root): 
if(root.subtree == None): return root.obj 
return (root.obj, tuple(map(tree_as_tuple, root.subtree.entries))) 

并一次打印三个中的一部分

print(tree_as_tuple(next(iter(p_tree.root.entries)))) 

返回以下内容,这是可以接受的

(24, ((24, ((80, ((89, )), (80, (71,80)))),)), (24, ((16, ((16, ((16,19)),)), (24, ((24, (24,)), 31, (23, 31)))))),)))

感谢@Stef 的反馈

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2012-10-22
    相关资源
    最近更新 更多