Определите, будет ли массив генерировать тот же самый предоставленный BST - Использовать рекурсию - PullRequest
0 голосов
/ 22 октября 2019

У меня есть проблема, с которой я сталкиваюсь с несколькими проблемами, вопрос заключается в следующем:

Given a pre-constructed Binary Search Tree and an array, determine if the array will produce the same Binary Search Tree.

Теперь этот вопрос будет иметь предварительно сконструированный BST длявы, а затем он будет запускать следующий код:

boolean valid = true;
for (int i = 0;valid && i < arr.length; i ++) {
   valid &= tree.checkPattern(arr[i]);
}

//These two methods below are in a different class. For every element in the array,
//the checkPattern method will be called, initially passing in the root of the BST
public void checkPattern(int key) {
   recursiveFunction(root, key);
}

public boolean recursiveFunction(TreeNode current, int key){
 // Recursive function 
}

Цель состоит в том, чтобы написать recursiveFunction(root, arr[i]), и намек на то, что класс TreeNode содержит логический visited, который вы будете использоватьчтобы помочь с этим алгоритмом.

Я не могу понять, как решить эту проблему ... Учитывая ключ, вы должны проверить, чтобы увидеть, где он будет в основной BST, и еслиродитель уже посещен, тогда верните false?

1 Ответ

2 голосов
/ 22 октября 2019

Один из способов - построить новый BST из массива, а затем сравнить два дерева. Подумайте о том, как это строит дерево по одному узлу за раз.

Теперь, с флагом visited в каждом узле, мы начинаем со всех флагов, которые являются ложными, затем логика:

  • Для каждого значения в массиве ищите узел для этого значения (целевой узел) в дереве:

    • Если целевой узел не найден,тогда ответ «нет» (дерево и массив имеют разные значения).

    • Если путь к целевому узлу шагает на каком-либо узле, который еще не был посещен, то ответ - нет (неправильный порядок).

    • (необязательно) Если целевой узел уже был посещен, выведите IllegalArgumentException (повторяющиеся значения в массиве не допускаются).

    • Пометить целевой узел, который посетил.

  • Сканирование дерева (BFS или DFS, не имеет значения), и если вы найдете какой-либоне посещенный узел, тогда ответ - нет (дерево и массив имеют разные значения).

  • Если вы попали сюда, ответ - да.

...