node* tree_delete() { node* z = tree_maximum(T); if(z->lchild == NULL) transplant(z,z->rchild); else if(z->rchild == NULL) transplant(z,z->lchild); else { node* y = tree_minimum(z->rchild); if(y->parent != z) { transplant(y,y->rchild); y->rchild = z->rchild; y->rchild->parent = y; } transplant(z,y); y->lchild = z->lchild; y->lchild->parent = y; } z->lchild = z->rchild = z->parent = NULL; return z; }
/* * * note: refer to the pseudocode in page 291. * */ int tree_maximum(bstnode *phead, bstnode **ppmaximum) { assert(phead && ppmaximum); if (NULL == phead->pright) { *ppmaximum = phead; } else { tree_maximum(phead->pright, ppmaximum); } }
tnode_p tree_predecessor(tnode_p node){ tnode_p next; if(node->left != NULL) return tree_maximum(node->left); next = node->parent; while(next != NULL && node == next->left){ node = next; next = next->parent; } return next; }
ltree tree_predecessor(ltree x) { ltree y; if (x->lchild != NULL) return tree_maximum(x->lchild); y = x->parent; while (y != NULL && x == y->lchild){ x = y; y = y->parent; } return y; }
int tree_predecessor(struct node * node_ptr) { struct node * node_ptr2 = NULL; if (node_ptr->left != NULL) { return tree_maximum(node_ptr); } else { node_ptr2 = node_ptr->parent; while (node_ptr2 != NULL && node_ptr == node_ptr2->left) { node_ptr = node_ptr2; node_ptr2 = node_ptr2->parent; } return node_ptr2->data; } }
int main(int argc, char** argv) { struct tree* tree; ALLOC_PTR(tree); assert(tree != 0); tree_ini(tree, 50); // int tree_node_add(struct tree* vtree, int value) int rc = tree_node_add(tree, 10); rc = tree_node_add(tree, 20); rc = tree_node_add(tree, 1); rc = tree_node_add(tree, 4); //fail rc = tree_node_add(tree, 120); rc = tree_node_add(tree, 110); rc = tree_node_add(tree, 130); rc = tree_node_add(tree, 100); //fail rc = tree_node_add(tree, 3); //fail inorder_tree_walk(tree->root); size_t start = 0; size_t finish = 0; struct node* t = 0; start = checkpoint(); t = tree_search(tree->root, 120); finish = checkpoint(); printf("\nrecursuve search %i\n", t->value); printf("time recursive: %zu\n", finish - start); start = finish = 0; start = checkpoint(); t = iterative_tree_search(tree->root, 120); finish = checkpoint(); printf("\niterative search %i\n", t->value); printf("time iterative: %zu\n", finish - start); t = tree_minimum(tree->root); printf("minimum: %i \n", t->value); t = tree_maximum(tree->root); printf("maximum: %i \n", t->value); struct node* temp; ALLOC_PTR(temp); assert(temp != 0); temp->value = 64; temp->right = 0; temp->left = 0; //T - дерево, z - указатель на вставляемую вершину tree_insert(tree, temp); inorder_tree_walk(tree->root); /* tree = tree_node_add(tree, 1, 1); //bad bug tree = tree_node_add(tree, 4, 1); tree = tree_node_add(tree, 2, 0); tree = tree_node_add(tree, 3, 0); tree = tree_node_add(tree, 4, 1); */ //tree_print(tree); /* tree_fini(tree); */ return 0; }