예제 #1
0
BRNode * treePredecessor(BRNode * x) {
    if (x->left != NULL) {
        return treeMaximum(x->left);
    }
    BRNode * y = x->p;
    while (y != NULL && x == y->left) {
        x = y;
        y = y->p;
    }
    return y;
}
예제 #2
0
extern void LSQ_RewindOneElement(LSQ_IteratorT iterator)
{
	IteratorT * iter = (IteratorT *)iterator;
	if (IS_HANDLE_INVALID(iterator) || (iter->tree->size == 0))
		return;
	if (LSQ_IsIteratorPastRear(iterator)){
		iter->node = treeMaximum(iter->tree->root);	
		iter->state = IST_DEREFERENCABLE;
		return;
	}
	iter->node = predecessor(iter->node);
	if (iter->node == NULL)
		iter->state = IST_BEFORE_FIRST;
}
예제 #3
0
static TreeNodeT * predecessor(TreeNodeT * node) 
{
	TreeNodeT * parent = NULL;
	TreeNodeT * cur_node = node;
	if (node == NULL)
		return NULL;
	parent = node->parent;
	if (node->l_child != NULL)
		return treeMaximum(node->l_child);
	while ((parent != NULL) && (cur_node == parent->l_child))
	{
		cur_node = parent;
		parent = parent->parent;
	}
	return parent;
}
int main()
{

    Arvore *raiz = NULL;
    Arvore *buscasNaArvore = NULL;
    Arvore *trazMenorMaior = NULL;
    int chave;
    int chaveBuscada;
    //int valor;
    int opcao;

    do{

        printf("Arvores de busca binaria sem balanceamento\n");
        printf("1 - Inserir\n");
        printf("2 - Mostrar\n");
        printf("3 - Pesquisar\n");
        printf("4 - Relembrar quem esta na raiz\n");
        printf("5 - Mostrar menor valor na arvore\n");
        printf("6 - Mostrar maior valor na arvore\n");
        printf("7 - Remover valor da arvore\n");
        printf("0 - Sair\n");

        scanf("%d",&opcao);

        switch(opcao){

            case 1:
                 printf("\ninforme a chave e tecle enter\n");
                 scanf("%d",&chave);
                 raiz = treeInsert(raiz,chave);
                 break;

            case 2:
                 printf("Valores alocados nessa arvore = \n");
                 mostraArvoreEmOrdem(raiz);
                 printf("\n");
                 break;

            case 3:
                 printf("\ndigite uma chave a ser buscada nessa arvore e tecle enter\n");
                 scanf("%d",&chaveBuscada);
                 buscasNaArvore = treeSearch(raiz,chaveBuscada);

                 if(buscasNaArvore!=NULL){

                    printf("encontrei esse cara\n");
                }else{
                    printf("valor nao presente na arvore\n");
                }
                break;

            case 4:
                mostraRaizDaArvore(raiz);
                break;

            case 5:
                if(raiz!=NULL){
                    trazMenorMaior = treeMinimum(raiz);
                    printf("menor valor nesta arvore = %d\n",trazMenorMaior->chave);
                }
                break;

            case 6:
                if(raiz!=NULL){
                    trazMenorMaior = treeMaximum(raiz);
                    printf("maior valor nesta arvore = %d\n",trazMenorMaior->chave);
                }
                break;

            case 7:
                if(raiz!=NULL){

                    printf("Informe o valor para deletar e tecle enter\n");
                    scanf("%d",&chaveBuscada);
                    raiz = treeDelete(raiz,chaveBuscada);
                }
                break;
            }

        }while(opcao!=0);

    return 0;
}