void et_set_father (struct et_node *t, struct et_node *father) { struct et_node *left, *right; struct et_occ *rmost, *left_part, *new_f_occ, *p; /* Update the path represented in the splay tree. */ new_f_occ = et_new_occ (father); rmost = father->rightmost_occ; et_splay (rmost); left_part = rmost->prev; p = t->rightmost_occ; et_splay (p); set_prev (new_f_occ, left_part); set_next (new_f_occ, p); p->depth++; p->min++; et_recomp_min (new_f_occ); set_prev (rmost, new_f_occ); if (new_f_occ->min + rmost->depth < rmost->min) { rmost->min = new_f_occ->min + rmost->depth; rmost->min_occ = new_f_occ->min_occ; } t->parent_occ = new_f_occ; /* Update the tree. */ t->father = father; right = father->son; if (right) left = right->left; else left = right = t; left->right = t; right->left = t; t->left = left; t->right = right; father->son = t; #ifdef DEBUG_ET et_check_tree_sanity (rmost); record_path_before (rmost); #endif }
struct et_node * et_new_tree (void *data) { et_node *nw = et_nodes.allocate (); nw->data = data; nw->father = NULL; nw->left = NULL; nw->right = NULL; nw->son = NULL; nw->rightmost_occ = et_new_occ (nw); nw->parent_occ = NULL; return nw; }
struct et_node * et_new_tree (void *data) { struct et_node *nw; if (!et_nodes) et_nodes = create_alloc_pool ("et_node pool", sizeof (struct et_node), 300); nw = pool_alloc (et_nodes); nw->data = data; nw->father = NULL; nw->left = NULL; nw->right = NULL; nw->son = NULL; nw->rightmost_occ = et_new_occ (nw); nw->parent_occ = NULL; return nw; }