Для подсчета листьев без рекурсии используйте концепцию итератора, подобную используемой в STL для дерева RB, лежащего в основе std::set
и std::map
... Создайте для вас функции begin()
и end()
дерево, которое идентифицирует упорядоченный первый и последний узел (в этом случае самый левый узел, а затем самый правый узел).Затем создайте функцию с именем
BinarySearchTreeNode* increment(const BinarySearchTreeNode* current_node)
, которая для данного current_node
будет возвращать указатель на следующий узел в дереве.Помните, что для реализации этой реализации вам понадобится дополнительный указатель parent
в вашем типе node
, чтобы помочь в процессе итерации.
Ваш алгоритм для increment()
будет выглядеть примерно так:
- Проверьте, есть ли правый дочерний элемент для текущего узла.
- Если есть правый потомок, используйте цикл while, чтобы найти самый левый узел этого правого поддерева.Это будет «следующий» узел.В противном случае перейдите к шагу № 3.
- Если на текущем узле нет правого потомка, проверьте, является ли текущий узел левым потомком своего родительского узла.
- Еслишаг № 3 является истинным, тогда «следующий» узел является родительским узлом, так что вы можете остановиться на этом этапе, в противном случае перейти к следующему шагу.
- Если шаг № 3 был ложным, то текущий узелправый ребенок родителя.Таким образом, вам нужно будет продолжать переходить к следующему родительскому узлу, используя цикл while, пока вы не наткнетесь на узел, который является левым потомком его родительского узла.Родителем этого левого дочернего узла будет «следующий» узел, и вы можете остановиться.
- Наконец, если шаг № 5 возвращает вас к корню, то текущий узел является последним узлом вдерево, и итератор достиг конца дерева.
Наконец, вам понадобится функция bool leaf(const BinarySearchTreeNode* current_node)
, которая будет проверять, является ли данный узел листовым узлом.Таким образом, функция счетчика может просто выполнить итерацию по дереву и найти все конечные узлы, возвращая окончательный счет, как только он будет сделан.
Если вы хотите измерить максимальную глубину несбалансированного дерева без рекурсии, вы, вфункция insert()
вашего дерева, необходимо отслеживать глубину, на которой был вставлен узел.Это может быть просто переменная вашего типа node
, которая устанавливается при вставке узла в дерево.Затем вы можете перебрать все три и найти максимальную глубину листового узла.
Кстати, сложность этого метода, к сожалению, будет O (N) ... нигде не так хорошо, как O(журнал N).