给定二叉树,我们如何将根打印到叶子路径,但是添加“_”来表示相对位置?
示例:
Input : Root of below tree
A
/ \
B C
/ \ / \
D E F G
Output : All root to leaf paths
_ _ A
_ B
D
_ A
B
_ E
A
_ C
F
A
_ C
_ _ G
答案 0 :(得分:2)
您可以使用预购行程访问树。使用缩进记录路径。
当访问左孩子减少缩进时,访问右孩子时增加缩进。然后你就可以得到像这样的路径,
(0, A), (-1, B), (-2, D)
(0, A), (-1, B), (0, E)
...
在输出阶段,规范化路径,找到路径节点的最小缩进并将路径节点移动到,
(2, A), (1, B), (0, D)
(1, A), (0, B), (1, E)
...
然后相应地打印路径。
这是python中的示例代码,
def travel(node, indent, path):
if not node:
print_path(path)
return
path.append((indent, node))
if node.left:
travel(node.left, indent - 1, path)
if node.right:
travel(node.right, indent + 1, path)
del path[-1]
def print_path(path):
min_indent = abs(min([x[0] for x in path]))
for indent, node in path:
p = []
for x in xrange(min_indent + indent):
p.append('_')
p.append(node.val)
print ' '.join(p)
答案 1 :(得分:1)
这个想法基于垂直顺序的打印路径。
1)我们对给定的二叉树进行Preorder遍历。遍历树时,我们可以递归计算水平距离或HD。我们最初将水平距离传递为0为root。对于左子树,我们将水平距离作为根的水平距离减去1.对于右子树,我们将水平距离作为根的水平距离加1。对于每个HD值,我们在向量中维护节点列表(“将存储当前节点水平距离和根“的密钥值”的信息。我们还维护节点的顺序(它们在从根到叶的路径中出现的顺序)。维持秩序。
2)当我们在遍历期间到达叶节点时,我们用下划线“_”
打印该路径a) First find the minimum Horizontal distance of the current path.
b) After that we traverse current path
First Print number of underscore “_” : abs (current_node_HD – minimum-HD)
Print current node value.
对所有root到leaf路径执行此过程。
答案 2 :(得分:1)
我无法让Qiang Jin对工作的反应非常正确。切换了一些东西。
class Node:
def __init__(self, val):
self.value = val
self.right = None
self.left = None
def printTreeRelativePaths(root):
indent = 0
path = []
preOrder(root, indent, path)
def preOrder(node, indent, path):
path.append((node, indent))
if not node.left and not node.right:
processPath(path)
if node.left:
preOrder(node.left, indent - 1, path)
if node.right:
preOrder(node.right, indent + 1, path)
del path[-1]
def processPath(path):
minIndent = 0
for element in path:
if element[1] < minIndent:
minIndent = element[1]
offset = abs(minIndent)
for element in path:
print ('_' * (offset + element[1])) + element[0].value
root = Node('A')
root.left = Node('B')
root.right = Node('C')
root.left.left = Node('D')
root.left.right = Node('E')
root.right.left = Node('F')
root.right.right = Node('G')
printTreeRelativePaths(root)