コード例 #1
0
/*!
* Remove um determinado dado da árvore
*
* @param dado Dado a ser removido da árvore
* @param arv Árvore a qual será iniciada a busca pelo dado a ser removido
*/
    NoAVL<T>* remover(NoAVL<T>* arv, const T& dado) {
        NoAVL<T>* temporario;
        NoAVL<T>* filho;
        if (arv == NULL) {
            return arv;
        } else if (dado < *(arv->getDado())) {
                arv->esquerda = this->remover(arv->getEsquerda(), dado);
                return balancear(arv);
            } else if (dado > *(arv->getDado())) {
                    arv->direita = this->remover(arv->getDireita(), dado);
                    return balancear(arv);
                } else if (arv->getDireita() != NULL &&
                            arv->getEsquerda() != NULL) {
                        temporario = this->minimo(arv->getDireita());
                        arv->dado = new T(static_cast<T const&>(*(temporario->
                                                                   getDado())));
                        arv->direita = remover(arv->getDireita(),
                                                *(temporario->getDado()));
                        return balancear(arv);
                    } else if (arv->getDireita() != NULL) {
                        filho = arv->getDireita();
                        return balancear(filho);
                        } else if (arv->esquerda != NULL) {
                                filho = arv->getEsquerda();
                                return balancear(filho);
                            }
        delete arv;
        return NULL;
    }
コード例 #2
0
ファイル: Binary_tree.cpp プロジェクト: brvboas/Binary-Tree
void Binary_tree::balancear(Binary_node *visit) {
    static int i = 0;
    static vector<int> v[50];
    if (v->back()!= NULL){
        if (visit != NULL) {
            balancear(visit->left);
            v[i]->insert(i,visit->key);
            i++;
            balancear(visit->right);
        }
    }

}
コード例 #3
0
ファイル: Arvore.cpp プロジェクト: Murilogabardo/Trunfo
No* Arvore::adicionar(const float cValor, No* pNo)
{
	if(cValor < pNo->getValor())
	{
		if(pNo->getEsquerda())
		{
			pAux3 = adicionar(cValor, pNo->getEsquerda());
			if(pAux3)
			{
				pNo->setEsquerda(pAux3);
			}
			altura(pNo);
			pAux3 = balancear(pNo);
		}
		else
		{
			pNo->setEsquerda(new No(cValor));
			return NULL;
		}
	}
	else
	{
		if(pNo->getDireita())
		{
			pAux3 = adicionar(cValor, pNo->getDireita());
			if(pAux3)
			{
				pNo->setDireita(pAux3);
			}
			altura(pNo);
			pAux3 = balancear(pNo);
		}
		else
		{
			pNo->setDireita(new No(cValor));
			return NULL;
		}
	}

	return pAux3;
}
コード例 #4
0
ファイル: AVL.c プロジェクト: OctavioMaia/LI3
/* inserir
 * Esta função recebe uma AVL, a direção para onde a AVL vai rodar,
 * a informação que se deseja inserir, um apontador que serve com flag
 * para balanciamento, e uma função de comparação. Insere a informação
 * num dos nodos e balanceia a árvore de modo a manter a diferença de
 * altura entre estes menor ou igual a 1.
 */
AVL inserir(AVL t, int dir, void *data, int* cresceu,int(*comp)(void*,void*)) {
	t->filho[dir] = inserirAVL(t->filho[dir],data,cresceu,comp);
	if (*cresceu) {
		if (t->factor_balanceamento==!dir) {
			t->factor_balanceamento=EQUAL;
			*cresceu=0;
		}
		else if (t->factor_balanceamento==EQUAL) {
			t->factor_balanceamento=dir;
			*cresceu=1;
		}
		else if (t->factor_balanceamento==dir) {
			t=balancear(t,dir);
			*cresceu=0;
		}
	}
	return t;
}
コード例 #5
0
/*!
* Insere um determinado dado na árvore
*
* @param dado Dado a ser inserido na árvore
* @param arv Árvore em que o dado vai ser inserido
*/
    NoAVL<T>* inserir(const T& dado, NoAVL<T>* arv) {
        NoAVL<T>* novo;
         if (dado < *(arv->getDado())) {
             if (arv->getEsquerda() == NULL) {
                 novo = new NoAVL<T>(dado);
                 arv->esquerda = novo;
             } else {
                 arv->esquerda = this->inserir(dado, arv->getEsquerda());
             }
         } else if (dado > *(arv->getDado())) {
             if (arv->getDireita() == NULL) {
                 novo = new NoAVL<T>(dado);
                 arv->direita = novo;
             } else {
                 arv->direita = this->inserir(dado, arv->getDireita());
             }
             }
         return balancear(arv);
    }