Печать списков в одной строке с использованием stdout - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь получить вывод BST, используя stdout вместо print.Проблема в том, что в stdout отображаются значения, которые перепутаны.

Я пытался делать такие вещи, как sys.stdout.write(' '.join(str(x) for x in str(node.data)))sys.stdout.write(str(node.data)).Код ниже.

import sys


class Node:
    def __init__(self, d):
        self.data = d
        self.left = None
        self.right = None


# function to convert sorted array to a
# balanced BST
# input : sorted array of integers
# output: root node of balanced BST
def sort_array_to_bst(arr):
    if not arr:
        return None

    # find middle
    mid = (len(arr)) / 2
    mid = int(mid)

    # make the middle element the root
    root = Node(arr[mid])

    # left subtree of root has all
    # values <arr[mid]
    root.left = sort_array_to_bst(arr[:mid])

    # right subtree of root has all
    # values >arr[mid]
    root.right = sort_array_to_bst(arr[mid + 1:])
    return root


# A utility function to print the preorder
# traversal of the BST
def pre_order(node):
    if not node:
        return

    #sys.stdout.write(' '.join(str(x) for x in str(node.data)))
    # Output : 5 71 5 78 9 83 9 72 61 7 86 7 9
    #sys.stdout.write(str(node.data))
    # Output: 5715789839726178679
    #print(node.data, end=" ")
    pre_order(node.left)
    pre_order(node.right)


arr = [7, 898, 157, 397, 57, 178, 26, 679]
root = sort_array_to_bst(arr[1:])
pre_order(root)

Ожидается, что выход будет 57 157 898 397 26 178 679.

Но, как закомментировано в коде для sys.stdout.write(' '.join(str(x) for x in str(node.data))), я получаю вывод 5 71 5 78 9 83 9 72 61 7 86 7 9

И для sys.stdout.write(str(node.data)), я получаю вывод 5715789839726178679.

Есть ли способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы не должны преобразовывать node.data в строку, прежде чем выполнять ее итерацию;в противном случае вы будете перебирать отдельные символы строки.

Изменить:

sys.stdout.write(' '.join(str(x) for x in str(node.data)))

на:

sys.stdout.write(' '.join(str(x) for x in node.data))
0 голосов
/ 15 февраля 2019

Вы звоните ' '.join() на str(node.data), что означает, что он займет 57 и присоединится к пробелу между каждым символом 57.Просто попробуйте заменить стандартный вывод на sys.stdout.write(str(node.data) + ' ') в функции pre_order().

...