Как и многие новички, моя голова взрывается от рекурсии. Я посмотрел много ответов/объяснений на SO. но я все еще не понимаю эту концепцию. (Это не домашнее задание, я пытаюсь переучивать то, что я не получил, и рекурсия никогда не была строкой)Построить BST от Preorder
При обходе предзаказов создайте двоичное дерево. С рекурсией это должно быть обманчиво простым :), но я просто не могу это получить.
I см., что порядок arr должен быть в узлах заказа. Какие ошибки я:
- Что делать, если узел уже имеет левый/правый? Как это работает?
Как могут узлы вставки рекурсии, например, в следующем порядке?
12, 10, 6, 13
15 является корнем, 5, 3 и оставили
Как 6 вставляются правильно, так как левый ребенок 10-х годов?
12
10 13
6*
Вот код скелета:
main()
{
int[] arr = {};
//make the first node a root node.
node n = new node(arr[0]);
buildbst(n, arr, 0)
}
buildbst(node root, int[] arr, int i)
{
if (i == arr.length) return;
if (arr[i] < root.data)
root.left = new node (arr[i]);
else
root.right = new node(arr[i]);
buildbst(root.left, arr, i++);
buildbst(root.right, arr, i++);
}
EDIT:
Я просто понял, если я прохожу в рекурсивном вызове buildbst(root.left, arr+i, i++)
является то, что правильный путь? Или я приближается это все неправильно - мешанину динамического программирования и рекурсии и разделяй и властвуй ...
Мы должны были бы поддерживать нижний и верхний пределы на каждом узле. Просто соблюдение верхних пределов не будет служить цели.В данном примере, если 25 был корнем выше 15, то конструкция была бы неверна с использованием вышеуказанного алгоритма. – noddy
@noddy Как только вы идете вправо, все элементы должны быть больше, чем этот элемент, иначе дерево недействительно, поэтому сохранение нижнего предела не требуется. Когда передано '25,15,5,1,20', когда' i' = 4, 'arr [i]' = 20 и 'mostSoFar' = 25, тогда' arr [i]
Dukeling
это именно то, что я искал, и это помогло мне исправить какой-то дополнительный код, который у меня был у меня! Как удаление minAllowed :), который был добавлен при движении вправо – fersarr