使用相对位置打印所有根到叶子路径

时间:2017-03-25 04:32:34

标签: algorithm recursion tree binary-tree

给定二叉树,我们如何将根打印到叶子路径,但是添加“_”来表示相对位置?

示例:

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

3 个答案:

答案 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)

这个想法基于垂直顺序的打印路径。

enter image description here

1)我们对给定的二叉树进行Preorder遍历。遍历树时,我们可以递归计算水平距离或HD。我们最初将水平距离传递为0为root。对于左子树,我们将水平距离作为根的水平距离减去1.对于右子树,我们将水平距离作为根的水平距离加1。对于每个HD值,我们在向量中维护节点列表(“将存储当前节点水平距离和根“的密钥值”的信息。我们还维护节点的顺序(它们在从根到叶的路径中出现的顺序)。维持秩序。

2)当我们在遍历期间到达叶节点时,我们用下划线“_”

打印该路径

enter image description here

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)