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

在Python中垂直打印树吗?像一棵真正的树

凌俊材
2023-03-14

我正在尝试打印一棵树,问题是我找不到任何其他方法,只能像这样打印它:

1
|__2
   |__3
      |__33
   |__4
|__22

但有没有办法像这样打印它:

      1
     / \
    2  22
   / \
  3   4
  |
  33

这是我的代码:

class treeNode:

    def __init__(self,data):
        self.data = data
        self.children = []
        self.parent = None
        self.nextSibling = None
        self.level = 0
        self.prevSibling = None

在这里,我为树节点创建了一个类,我知道代码很糟糕,但我仍然是初学者,我将在未来改进它。我使用列表来存储子列表和链表来对兄弟姐妹进行排序,因为它稍后在尝试打印实际树时会很有用。

    def add_children(self,*child):
        for i in child:
            i.parent = self
            self.children.append(i)
            if len(self.children) > 1:
                self.children[-2].nextSibling = i

class Tree:

    def __init__(self,root:treeNode):
        self.root = root
        self.depth = 0

    def print_tree(self):
        print(self.root.data)
        kid = self.root.children[0]
        while (kid != self.root):
            kid.level_func()
            print("  " * (kid.level - 1) * 2 + "|" + "__",kid.data)
            if len(kid.children) == 0:
                while kid.parent:
                    if kid.nextSibling:
                        kid = kid.nextSibling
                        break
                    else:
                        kid = kid.parent
            else:
                kid = kid.children[0]

我打印树的方式是这样的:打印当前节点,如果当前节点有任何子节点,则转到子节点,如果没有,则转到当前节点的父节点的下一个兄弟节点,它将继续这样,直到到达根节点。

提前致谢 :)

共有1个答案

和选
2023-03-14

如果您的树是二叉树,则可以在此处使用printBTree函数获得第二种形式

例如:

              80
          ___/  \___
        50          90
     __/  \__      /
   10        60  85
  /  \      /  \
 5    30  55    70
        \
         35

您可以尝试为具有多个子树的树创建一个变体,但很快就会耗尽水平空间。

对于这些树,缩进格式是可取的,尽管你可以让它看起来更好一点:

def printTree(node,nodeInfo,indent=""):
    label,children = nodeInfo(node)
    print(indent[:-3] + "|_ "*bool(indent) + str(label))
    for more,child in enumerate(children,1-len(children)):
        childIndent = "|  " if more else "   "
        printTree(child,nodeInfo,indent+childIndent)

用法:

T = {'data': 1, 'children':
        [ { 'data':2, 'children':
            [ {'data':6 }, {'data':7} ]},
          {'data':3},
          {'data':4},
          {'data':5, 'children':
           [{'data':10}]}
        ]
     }

printTree(T,lambda d:(d['data'],d.get('children',[])))

1
|_ 2
|  |_ 6
|  |_ 7
|_ 3
|_ 4
|_ 5
   |_ 10

您可以将 printTree 与 treeNode 类一起使用,如下所示:

printTree(myTree.root,lambda n:(n.data,n.children))
 类似资料:
  • 我目前正在尝试实现一个树(不是二进制的,顺序不重要,不是定向的)数据结构。当一棵树的根与另一棵树的子节点相同时,我希望将树合并在一起 第一棵树的子树应该成为第二棵树的子树,第二棵树的子树与第一棵树的根相同。要合并的树可能更深。 我实现了像这样: 然后我有一个树列表

  • 问题内容: 我想以以下方式打印我的二叉树: 我已经编写了用于插入节点的代码,但是无法编写用于打印树的代码。所以请帮忙。我的代码是: 问题答案: 您正在寻找的是广度优先遍历,它使您可以逐级遍历树。基本上,您使用队列来跟踪需要访问的节点,并在运行时将孩子添加到队列的 后面 (而不是将它们添加到堆栈的 前面 )。首先开始工作。 完成此操作后,您可以找出树具有()的级别,并使用该级别来估计空白。如果要使空

  • 假设给定一组树ST,每棵树的每个顶点都被标记。另外还给出了另一棵树T(也有顶点标签)。问题是如何找到ST的哪些树可以从T的根开始跨越树T,从而使生成树T的顶点标签与T的顶点标签一致。请注意,T的每个顶点的子节点要么完全覆盖,要么根本不覆盖——不允许部分覆盖子节点。换句话说:给定一棵树和以下过程:选择一个顶点,删除该顶点以下的所有顶点和边(除了顶点本身)。找到ST的那些树,这样每棵树都是用一系列应用

  • 我必须使用绘制一个可呈现的树。你可以在图片中看到 应满足此链接中陈述的所有原则。 原则是: 原则1:树的边不应该互相交叉。 原则2:相同深度的所有节点应绘制在同一水平线上。这有助于清除树的结构。 原则3:树木的绘制应尽可能窄。 原则4:父母应以子女为中心。 原则5:子树无论位于树中的哪个位置,都应以相同的方式绘制。 原则 6:父节点的子节点应均匀分布。 如何计算每个节点的X、Y位置?

  • 我有一个很严重的问题,就是在一棵树中重复搜索子树。 我试过了,但是。。。 似乎没有正确的形式。containsTree函数在找到与另一个节点不同的节点时停止搜索。 下面是两棵树的例子。 在这种情况下,当函数比较右边的子树和左边的子树时,当find等于父节点但它有不同的子节点时,它会停止搜索。我需要函数不要停止搜索,而是抛出这一点,搜索所有其他子节点及其子树。

  • 我使用的是D3树布局,例如:http://mbostock.github.com/d3/talk/20111018/tree.html 我已经根据我的需求对其进行了修改,并且遇到了一个问题。该示例也存在相同的问题,如果您打开了太多节点,那么它们就会变得紧凑,并使读取和交互变得困难。我想在重新调整舞台尺寸时定义节点之间的最小垂直空间,以允许这样的间距。 我尝试修改分离算法使其工作: 这不起作用。我还