Ejemplo n.º 1
0
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);
    }

}
Ejemplo n.º 3
0
Archivo: tree.c Proyecto: Limaa/libds
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;
}
Ejemplo n.º 4
0
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;
	}
}
Ejemplo n.º 6
0
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;
}