Это похоже на упражнение, которое я делал в инженерной школе 25 лет назад.
Я думаю, что это называется алгоритм огибающей дерева, поскольку он строит огибающую дерева.
Я не могу поверить, что это так просто. Должно быть, я где-то допустил ошибку.
Любая ошибка, независимо от того, я считаю, что обволакивающая стратегия верна.
Если код ошибочный, просто обработайте его как псевдокод.
while current node exists{
go down all the way until a leaf is reached;
set current node = leaf node;
visit the node (do whatever needs to be done with the node);
get the next sibling to the current node;
if no node next to the current{
ascend the parentage trail until a higher parent has a next sibling;
}
set current node = found sibling node;
}
Код:
void traverse(Node* node){
while(node!=null){
while (node->child!=null){
node = node->child;
}
visit(node);
node = getNextParent(Node* node);
}
}
/* ascend until reaches a non-null uncle or
* grand-uncle or ... grand-grand...uncle
*/
Node* getNextParent(Node* node){
/* See if a next node exists
* Otherwise, find a parentage node
* that has a next node
*/
while(node->next==null){
node = node->parent;
/* parent node is null means
* tree traversal is completed
*/
if (node==null)
break;
}
node = node->next;
return node;
}