问题描述
"Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://company.lightning.force.com') does not match the recipient window's origin ('null')."
我有这段代码可以构造二叉树,但它无法在终端中显示树。很难做到!这里有没有人可以添加一个可以在终端中显示二叉树的方法?
对于上面的例子,它可能看起来像
解决方法
为解决您的任务而实施的算法。例如在与您的图片相同的数据上测试输出,尝试更大数量的数字以查看更漂亮的图片。
在我的算法中,每个子树的宽度和高度以及边的长度都是自适应的。
懂俄语的人可以阅读我的other post,关于相同的主题,控制台中的二叉树构造。另一篇文章用 C++ 实现了几种可视化算法。如果你至少不会俄语,你可以从那里复制 C++ 代码。
class Node:
def __init__(self,data,left=None,right=None):
self.data = data
self.left = left
self.right = right
def print_tree(node):
def inner(node):
if node is None:
return []
sdat = str(node.data)
l,r = inner(node.left),inner(node.right)
cl,cr = len((l or ('',))[0]),len((r or ('',))[0])
s = max(cl,cr)
sll,slr = (s - cl + 1) // 2,(s - cl) // 2
srl,srr = (s - cr) // 2,(s - cr + 1) // 2
v = [' ' * s + sdat + ' ' * s]
v.extend([' ' * (s - i - 1) + '/' + ' ' * i + ' ' * len(sdat) +
' ' * i + '\\' + ' ' * (s - i - 1) for i in range(s // 2)])
v.extend([(' ' * sll + l[i] + ' ' * slr if i < len(l) else ' ' * s) +
' ' * len(sdat) + (' ' * srl + r[i] + ' ' * srr if i < len(r) else ' ' * s)
for i in range(max(len(l),len(r)))])
return v
print('\n'.join(inner(node)))
if __name__ == '__main__':
root = Node(1,Node(2,Node(4)),Node(3,Node(5,Node(7),Node(8)),Node(6)))
print_tree(root)
输出:
1
/ \
/ \
/ \
2 3
4 / \
5 6
7 8
上面的第一个算法是使用预排序完成的。我正在使用 inorder 提供第二个算法。它有一个不同的更简单的输出:
class Node:
def __init__(self,right=None):
self.data = data
self.left = left
self.right = right
def print_tree(node):
def inner(node,*,upref = '',cpref = '',dpref = ''):
if node is None:
return
inner(node.right,upref = dpref + ' |',cpref = dpref + ' /',dpref = dpref + ' ')
print(cpref + '--' + str(node.data))
inner(node.left,upref = upref + ' ',cpref = upref + ' \\',dpref = upref + ' |')
inner(node)
if __name__ == '__main__':
root = Node(1,Node(6)))
print_tree(root)
输出:
/--6
/--3
| | /--8
| \--5
| \--7
--1
\--2
\--4
实现第 3 种算法进行预排序,但比第一种算法简单得多:
class Node:
def __init__(self,last = True,pref = ''):
if node is None:
return
print(pref + ('\\-' if last else '|-') + str(node.data))
inner(node.right,last = False,pref = pref + (' ' if last else '| '))
inner(node.left,pref = pref + (' ' if last else '| '))
inner(node)
if __name__ == '__main__':
root = Node(1,Node(6)))
print_tree(root)
输出:
\-1
|-3
| |-6
| \-5
| |-8
| \-7
\-2
\-4