По определению, next () и hasNext () не могут быть запущены за O (1) раз.Когда вы смотрите на конкретный узел в BST, вы не имеете представления о высоте и структуре других узлов, поэтому вы не можете просто «перейти» к правильному следующему узлу.
Однако пространствосложность может быть уменьшена до O (1) (за исключением памяти для самого BST).Вот способ, которым я бы сделал это в C:
struct node{
int value;
struct node *left, *right, *parent;
int visited;
};
struct node* iter_next(struct node* node){
struct node* rightResult = NULL;
if(node==NULL)
return NULL;
while(node->left && !(node->left->visited))
node = node->left;
if(!(node->visited))
return node;
//move right
rightResult = iter_next(node->right);
if(rightResult)
return rightResult;
while(node && node->visited)
node = node->parent;
return node;
}
Хитрость заключается в том, чтобы иметь и родительскую ссылку, и флаг посещения для каждого узла.По моему мнению, мы можем утверждать, что это не дополнительное использование пространства, это просто часть структуры узла.И очевидно, что iter_next () должен вызываться без изменения состояния древовидной структуры (конечно), но также и то, что флаги «посещения» не меняют значений.
Вот функция тестера, которая вызывает iter_next) и печатает значение каждый раз для этого дерева:
27
/ \
20 62
/ \ / \
15 25 40 71
\ /
16 21
int main(){
//right root subtree
struct node node40 = {40, NULL, NULL, NULL, 0};
struct node node71 = {71, NULL, NULL, NULL, 0};
struct node node62 = {62, &node40, &node71, NULL, 0};
//left root subtree
struct node node16 = {16, NULL, NULL, NULL, 0};
struct node node21 = {21, NULL, NULL, NULL, 0};
struct node node15 = {15, NULL, &node16, NULL, 0};
struct node node25 = {25, &node21, NULL, NULL, 0};
struct node node20 = {20, &node15, &node25, NULL, 0};
//root
struct node node27 = {27, &node20, &node62, NULL, 0};
//set parents
node16.parent = &node15;
node21.parent = &node25;
node15.parent = &node20;
node25.parent = &node20;
node20.parent = &node27;
node40.parent = &node62;
node71.parent = &node62;
node62.parent = &node27;
struct node *iter_node = &node27;
while((iter_node = iter_next(iter_node)) != NULL){
printf("%d ", iter_node->value);
iter_node->visited = 1;
}
printf("\n");
return 1;
}
, которое будет печатать значения в отсортированном порядке:
15 16 20 21 25 27 40 62 71