Можно получить следующий узел в порядке, учитывая указатель на некоторый узел, если вы сохраняете родительские указатели.Это можно использовать для итерации дерева, начиная с самого левого узла.Из моей реализации дерева AVL :
BAVLNode * BAVL_GetNext (const BAVL *o, BAVLNode *n)
{
if (n->link[1]) {
n = n->link[1];
while (n->link[0]) {
n = n->link[0];
}
} else {
while (n->parent && n == n->parent->link[1]) {
n = n->parent;
}
n = n->parent;
}
return n;
}
Чтобы получить самый левый узел:
BAVLNode * BAVL_GetFirst (const BAVL *o)
{
if (!o->root) {
return NULL;
}
BAVLNode *n = o->root;
while (n->link[0]) {
n = n->link[0];
}
return n;
}
Здесь, node->link[0]
и node->link[1]
- это левые иправый потомок узла, соответственно, и node->parent
- указатель на родительский узел (или NULL
для корня).
Одна операция GetNext () имеет сложность времени O (logn).Однако при использовании для итерации всего дерева вы получаете O (n) амортизированной сложности по времени.