>>306-316、は妨害、↓は再帰的に処理を説明した方がいい
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize; int crnt;//子ノード指示変数
...
 //終了検知
 bool end(tree* root, bool b){
  return ((b || !childsize) && this == root && (crnt < 0 || childsize <= crnt))
 }
 //crntの順番のノードを返す
 tree* crntchild(bool& b){
  if(crnt < 0 || childsize <= crnt) { b = true; return parent; }
  return child[crnt];
 }
};
//root以下のノード処理
void nodefunc(tree* root)
{
 crntzero(root);//root以下のcrntを全てゼロ初期化処理:詳細は省略
 tree* v = root; bool b = false;
 //最初のノード処理
 while(!v->end(root, b)){
  v->crnt += 1; //次のノード b = false;
  v = v->crntchild(b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}