В первом куске кода получается ноль потому, что сначала Вы узел удаляете, а потом для удаленного узла пытаетесь получить следующий на том же уровне. Нужно это делать перед удалением, т.к. idx удаленного узла становится недействительным.
Что есть "пустая нода"? Та, у которой нет дочерних? Ведь этак проще всего просто удалить все элементы, т.к. удаляя "пустую" по такому критерию на разных уровнях, постепенно придем к тому, что все будут пустыми.
Все элементы можно обойти рекурсивно (об этом писали выше):
X++:
void iterate(TreeItemIdx _idx)
{
while (idx)
{
// ...
iterate(tree.getChild(_idx));
// ...
_idx = tree.getNextSibling(_idx);
}
}
;
iterate(tree.getRoot());