int treeLevel(TreeNode* root) { if (root == NULL) { return 0; } else { return max(treeLevel(root->left), treeLevel(root->right)) + 1; } }
double ps_rec_write_tree_owner(PASTIX_INT nodenum, PASTIX_INT *ownertab, const CostMatrix *costmtx, const EliminTree *etree, FILE *out, void (*ps_draw_node)(FILE *out, PASTIX_INT nodenum, PASTIX_INT procnum, const CostMatrix *costmtx, const EliminTree *etree, double s, double x, double y)) { static PASTIX_INT cx; PASTIX_INT nodelevel; double pos=0, lpos=0, rpos=0; double s, sy; nodelevel = nodeTreeLevel(nodenum, etree); sy= 1.4*500.0/treeLevel(etree); s= 500.0/treeLeaveNbr(etree); if (nodenum == ROOT(etree)) { cx= 0; } pos= 0; /* draw sons */ switch (etree->nodetab[nodenum].sonsnbr) { case 2: { rpos= ps_rec_write_tree_owner(TSON(etree, nodenum, 1), ownertab, costmtx, etree, out, ps_draw_node); pos+= rpos; } case 1: { lpos= ps_rec_write_tree_owner(TSON(etree, nodenum, 0), ownertab, costmtx, etree, out, ps_draw_node); pos+= lpos; pos/= etree->nodetab[nodenum].sonsnbr; break; } case 0: { pos= (double)cx; cx++; break; } default: { errorPrint("Erreur dans l'arbre d'elimination \n\tCblk %ld sonsnbr %ld \n\tAttention on ne peut imprimer l'arbre d'elimination que pour les grilles !!", (long)nodenum, (long)(etree->nodetab[nodenum].sonsnbr)); EXIT(MOD_BLEND,INTERNAL_ERR); } } /* draw links to sons */ switch (etree->nodetab[nodenum].sonsnbr) { case 2: { fprintf(out, "np %f %f m %f %f l %f %f l sk\n", lpos*s, (nodelevel+1)*sy, pos*s, nodelevel*sy, rpos*s, (nodelevel+1)*sy); break; } case 1: { fprintf(out, "np %f %f m %f %f l sk\n", lpos*s, (nodelevel+1)*sy, pos*s, (nodelevel)*sy); break; } } ps_draw_node_owner(out, nodenum, ownertab[nodenum], costmtx, etree, sy, pos*s, sy*nodelevel); return pos; }
vector<vector<int>> levelOrderBottom(TreeNode* root) { int level = treeLevel(root); vector<vector<int>> result(level, vector<int>()); dfs(root, result, level - 1); return result; }