Надеюсь, это приемлемый вопрос. Я понимаю способ мышления для рекурсии, где я хочу думать о базовых случаях, а затем о рекурсивных случаях, но с некоторыми из более сложных проблем BST я просто рисую пробелы, и мне кажется, что я теряюсь без хорошего направления.Существуют ли какие-либо «стратегии» для решения проблем двоичного дерева?
С помощью связанных списков, например, кажется, что есть образец, который подходит к проблеме, но BTs кажутся либо вы знаете, либо не знаете. Любые советы/указатели? Единственное понятие я, кажется, получили вниз, что если я имею дело с нулевыми узлами, и я хочу сделать что-то с ними, или о них, я буду иметь это в случае
if(root == null)
//do something
или если Я не имею ничего общего с нулевыми узлы, то я использую перевернутый базовый случай
if(root != null)
//do stuff
else
//do nothing for null case
Но даже тогда я приду к потере на то, что рядом. Я думаю, вот пример проблемы, с которой я застрял, и не знаю, как подойти. Я не обязательно ищу ответ, просто потенциальную стратегию для решения таких вопросов (и регулярных двоичных древовидных вопросов).
Написать метод numberNodes
, который изменяет данные, хранящиеся в виде двоичного дерева, назначая последовательные целые числа, начиная с 1 до каждого узла таким образом, что предварительный заказ обход будет производить числа в порядке (1, 2, 3, и т.д.). Например, с учетом дерева, на которое ссылается дерево внизу слева, вызов tree.numberNodes();
будет перезаписывать существующие данные, присваивая значениям узлов от 1 до 6, так что обход по порядку дерева будет производить 1, 2, 3, 4, 5, 6
.
Вы не должны изменить структуру дерева. Вы просто меняете значения, хранящиеся в полях данных. Ваш метод должен возвращать подсчет количества узлов в дереве.
Предположим, что вы добавляете этот метод к IntTree
класса, как определено ниже:
public class IntTree {
private IntTreeNode overallRoot;
...
}
После глядя на код еще немного, я полагаю, что я должен использовать мой int count
в качестве средства для определения, если Я перемещаюсь в левый корень или правый корень, так как это двоичное дерево поиска, но я все еще не могу реализовать эту функциональность ... блок кодирования ahh!
Нарисуйте его, напишите свой класс Node и пройдете то, что вам нужно сделать –