我正在尝试打印一棵树,问题是我找不到任何其他方法,只能像这样打印它:
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]
我打印树的方式是这样的:打印当前节点,如果当前节点有任何子节点,则转到子节点,如果没有,则转到当前节点的父节点的下一个兄弟节点,它将继续这样,直到到达根节点。
提前致谢 :)
如果您的树是二叉树,则可以在此处使用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 我已经根据我的需求对其进行了修改,并且遇到了一个问题。该示例也存在相同的问题,如果您打开了太多节点,那么它们就会变得紧凑,并使读取和交互变得困难。我想在重新调整舞台尺寸时定义节点之间的最小垂直空间,以允许这样的间距。 我尝试修改分离算法使其工作: 这不起作用。我还