Так как я использую его рекурсивно.Я не понимаю, как функция может на самом деле печатать несколько разных буферов, так как в буфере есть несколько \ 0.
Это довольно просто.В качестве примера рассмотрим дерево,
*
/ \
x ...
То есть с листом слева и некоторым поддеревом справа. Начнем с
i = 0, c = []
Ваш алгоритм сначала идет влево(все еще должно идти направо),
i = 1, c = [0]
Это лист, поэтому он добавляет ноль,
i = 1, c = [0, \0]
и печатает.Эта ветвь выполнена так, что она возвращается, и мы имеем,
i = 0, c = [0, \0]
помните, i
передается по значению, но c
- это массив, а массивы передаются по ссылке.Итак, мы идем направо,
i = 1, c = [0, 1]
, и ноль исчез.
Еще один пример, когда ноль не переопределяется.Предположим,
*
/ \
/ y
x
Вы дважды идете влево,
i = 0, c = []
i = 1, c = [0]
i = 2, c = [0, 0]
, затем добавляете ноль и печатаете
i = 2, c = [0, 0, \0]
, так как на правой стороне только ветвькорень, вот куда он будет возвращаться,
i = 0, c = [0, 0, \0]
, а затем он идет вправо,
i = 1, c = [1, 0, \0]
, и это лист, поэтому мы добавим ноль и напечатаем его,
i = 1, c = [1, \0, \0]
Я думаю, этого должно быть достаточно, чтобы понять, что происходит.
Точка сразу после вставки \0
вы возвращаетесь к меньшему i
и продолжаете строить новую строку оттуда.Так что ни в коем случае у вас не будет позиции \0
до вашей текущей i
.