Сначала о массивах: чтобы заполнить массив, вам нужно заранее знать длину массива. Если вам не нужно указывать длину для создания экземпляра массива (в зависимости от языка, который вы используете), тогда это не совсем массив. Это динамическая структура данных c, размер которой автоматически увеличивается в результате языковой реализации.
Теперь я предполагаю, что вы заранее не знаете размер дерева. Если вы знаете размер, вы можете создать экземпляр массива указанного размера. Предполагая, что вы не знаете размер массива, вам нужно go с динамической c структурой данных, такой как ArrayList
в Java.
Так на каждом print(x.key)
в вашем коде просто добавьте x.key
в список (например, list.add(x.key)
). После завершения обхода вы можете превратить ваш List
в array
.
Вы также можете использовать итерационную версию обхода.
Одно простое решение для рекурсии Подход заключается в использовании одного элемента массива для отслеживания индекса, например:
void inOrder(x, int[] idx, int[] arr):
if x != NIL:
inOrder(x.left, idx, arr)
arr[idx[0]++] = x.key
inOrder(x.right, idx, arr)
, хотя я уверен, что могут быть и другие способы, которые могут стать громоздкими (возможно). В любом случае я предпочитаю итеративную версию.