Example #1
0
        private Nodo insert_tree(Nodo no, int value)
        {
            if (no_eh_externo(no))
            {
                /*árvore vazia: insere e sinaliza alteração de FB*/
                no = _aloca(value, no);
                flag = true;
                qtde++;
                return no;
            }

            if (value > no.get_valor())
            {
                no.set_no_direita(insert_tree(no.get_no_direita(), value));
                if (flag) /*inseriu: verificar balanceamento*/
                    switch (no.get_balance())
                    {
                        case -1:
                            no.set_balance(0);
                            flag = false;
                            break;
                        case 0:
                            no.set_balance(1);
                            break;
                        /*direita fica maior: propaga verificação*/
                        case 1: /*FB(p) = 2 e p retorna balanceado*/
                            no = _SideRight(no);
                            flag = false;
                            break;
                    }
            }

            if (value < no.get_valor())
            {
                no.set_no_esquerda(insert_tree(no.get_no_esquerda(), value));
                if (flag)
                    switch (no.get_balance())
                    {
                        case 1: /*mais alto a direita*/
                            no.set_balance(0); /*balanceou com ins. esq*/
                            flag = false; /*interrompe propagação*/
                            break;
                        case 0:
                            no.set_balance(-1); /*ficou maior à esq.*/
                            break;
                        case -1: /*FB(p) = -2*/
                            no = _SideLeft(no); /*p retorna balanceado*/
                            flag = false;
                            break; /*não propaga mais*/
                    }
            }

            return no;
        }
Example #2
0
 // verifica se um determinado Nodo é externo
 public bool no_eh_externo(Nodo no)
 {
     return (no.get_no_direita() == null) && (no.get_no_esquerda() == null);
 }
Example #3
0
 private Nodo _rot_right(Nodo p)
 {
     Nodo q, temp;
     q = p.get_no_esquerda();
     temp = q.get_no_direita();
     q.set_no_direita(p);
     p.set_no_esquerda(temp);
     p = q;
     return p;
 }
Example #4
0
        private Nodo _SideLeft(Nodo no)
        {
            /*x foi inserido à esq. de p e causou FB= -2*/
            Nodo u;
            u = no.get_no_esquerda();
            if (u.get_balance() == -1) /*caso sinais iguais e negativos: rotação à direita*/
                no = _rot_right(no);
            else /*caso sinais trocados: rotação dupla u + p*/
                no = _rot_left_right(no);

            no.set_balance(0);

            return no;
        }
Example #5
0
        private Nodo _rot_left_right(Nodo p)
        {
            Nodo u, v;

            u = _rot_left(p.get_no_esquerda());
            p.set_no_esquerda(u);
            v =_rot_right(p);
            /*

            u = p.get_no_esquerda();
            v = u.get_no_direita();

            u.set_no_direita(v.get_no_esquerda());
            p.set_no_esquerda(v.get_no_direita());

            /*atualizar FB de u e p em função de FB de v - a nova raiz*/
            /*antes: u^.bal=1 e p^.bal=-2*/

            if (v.get_balance() == -1)
            {
                u.set_balance(0);
                p.set_balance(1);
            }
            else
            {
                p.set_balance(0);
                u.set_balance(-v.get_balance());
            }

            v.set_no_esquerda(u);
            v.set_no_direita(p);
            p = v;
            return p;
        }