Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 8.44 KB | None | 0 0
  1. package casa09;
  2.  
  3. public class SplayTreeImpl implements SplayTree {
  4.    
  5.     No raiz;
  6.     private String visita;
  7.    
  8.     @Override
  9.     public int inserir( int elem ) {
  10.         if ( elem < 0 ) return -1;
  11.        
  12.         No y = null;
  13.         No x = raiz;
  14.         No z = new No( elem );
  15.        
  16.         while ( x != null ) {
  17.             y = x;
  18.             if ( z.getValor() < x.getValor() )
  19.                 x = x.getEsquerda();
  20.             else if ( z.getValor() > x.getValor() )
  21.                 x = x.getDireita();
  22.             else {
  23.                 splay(x);
  24.                 return 1;
  25.             }
  26.         }
  27.         z.setPai( y );
  28.        
  29.         if ( y == null ) {
  30.             raiz = z;
  31.         } else if ( z.getValor() < y.getValor() ) {
  32.             y.setEsquerda( z );
  33.         } else {
  34.             y.setDireita( z );
  35.         }
  36.        
  37.         splay(z);
  38.         return 0;
  39.     }
  40.    
  41.    
  42.     public No pesquisarNode( int elem ) {
  43.         No temp = raiz;
  44.         No tempPai = null;
  45.        
  46.         // Pesquisa o Nó
  47.         while ( temp != null && temp.getValor() != elem ) {
  48.             tempPai = temp.getPai();
  49.            
  50.             if ( temp.getValor() > elem )
  51.                 temp = temp.getEsquerda();
  52.             else
  53.                 temp = temp.getDireita();
  54.         }
  55.        
  56. //      if (temp != null)
  57. //          splay(temp);
  58. //      else
  59. //          splay(tempPai);
  60.        
  61.         return temp;
  62.     }
  63.    
  64.     @Override
  65.     public int pesquisar( int elem ) {
  66.         No temp = pesquisarNode( elem );
  67.         return temp == null ? -1 : profundidade( temp.getPai() );
  68.     }
  69.  
  70.     @Override
  71.     public int remover( int elem ) {
  72.         No temp = raiz;
  73.         No tempPai = null;
  74.        
  75.         // Pesquisa o Nó
  76.         while ( temp != null && temp.getValor() != elem ) {
  77.             tempPai = temp.getPai();
  78.            
  79.             if ( temp.getValor() > elem )
  80.                 temp = temp.getEsquerda();
  81.             else
  82.                 temp = temp.getDireita();
  83.         }
  84.        
  85.        
  86.         return -1;
  87.     }
  88.  
  89.     @Override
  90.     public String percorrePreOrdem() {
  91.         visita = "";
  92.         percorrePreOrdem( raiz );
  93.        
  94.         return "[" + visita.trim() + "]";
  95.     }
  96.    
  97.     private void percorrePreOrdem( No no ) {
  98.         if ( no != null ) {
  99.             visita += no.getValor() + " ";
  100.             percorrePreOrdem( no.getEsquerda() );
  101.             percorrePreOrdem( no.getDireita() );
  102.         }
  103.     }
  104.    
  105.     /**
  106.      * Retorna a profundidade de um determinado Nó
  107.      * @param n Nó para achar a profundidade
  108.      * @return Profundidade do Nó n.
  109.      */
  110.     public int profundidade( No n ) {
  111.         if ( n == null ) return -1;
  112.        
  113.         No no = n;
  114.         int count = 0;
  115.        
  116.         while ( no.getPai() != null ) {
  117.             no = no.getPai();
  118.             count++;
  119.         }
  120.        
  121.         return count;
  122.     }
  123.    
  124.    
  125.     public void splay( No filho ) {
  126.        
  127.         if (raiz == null || raiz.equals( filho ))
  128.             return;
  129.        
  130.         while ( !filho.equals( raiz ) ) {
  131.            
  132.             No pai = filho.getPai();
  133.             No avo = pai.getPai();
  134.            
  135.             // Se o avo for null, então o pai é a raiz. zig simples.
  136.             if ( avo == null ) {
  137.                 // Se for o filho da esquerda é zig_Right
  138.                 if ( filho.equals( pai.getEsquerda() ) ) {
  139.                     zig_Right( filho );
  140.                 // Se não, é zig_Left
  141.                 } else {
  142.                     zig_Left( filho );
  143.                 }
  144.             // Se o avo não for null, entao é zig duplo.
  145.                 // Se for filho da esquerda:
  146.             } else if ( filho.equals( pai.getEsquerda() ) ) {
  147.                 // Se for neto da esquerda, entao é zig_Zig_Right
  148.                 if ( pai.equals( avo.getEsquerda() ) ) {
  149.                     zig_Zig_Right( filho );
  150.                 // Se não é zig_Zag_Left
  151.                 } else {
  152.                     zig_Zag_Left( filho );
  153.                 }
  154.                 // Se nao for filho da esquerda, é filho da direita:
  155.             } else {
  156.                 // Se for neto da direita, entao é zig_Zig_Left
  157.                 if ( pai.equals( avo.getDireita() ) ) {
  158.                     zig_Zig_Left( filho );
  159.                 // Se não é zig_Zag_Right
  160.                 } else {
  161.                     zig_Zag_Right( filho );
  162.                 }
  163.             }
  164.         }
  165.     }
  166.    
  167.     public void zig_Right( No filho ) {
  168.         No pai = filho.getPai();
  169.         No B = filho.getDireita();
  170.    
  171.         // Muda o pai de filho
  172.         filho.setPai( null );
  173.         // Muda o filho Direito de filho
  174.         filho.setDireita( pai );
  175.         // Muda o pai de pai
  176.         pai.setPai( filho );
  177.        
  178.         // Muda o filho Esquerdo de pai
  179.         pai.setEsquerda( B );
  180.         // Muda o pai de B
  181.         if ( B != null )
  182.             B.setPai( pai );
  183.        
  184.         // atualiza a raiz;
  185.         raiz = filho;
  186.        
  187.     }
  188.    
  189.     public void zig_Left( No filho ) {
  190.         No pai = filho.getPai();
  191.         No B = filho.getEsquerda();
  192.        
  193.         // Muda o pai de filho
  194.         filho.setPai( null );
  195.         // Muda o filho Esquerdo de filho
  196.         filho.setEsquerda( pai );
  197.         // Muda o pai de pai
  198.         pai.setPai( filho );
  199.        
  200.         // Muda o filho Direito de pai
  201.         pai.setDireita( B );
  202.         // Muda o pai de B
  203.         if ( B != null )
  204.             B.setPai( pai );
  205.        
  206.         // atualiza a raiz;
  207.         raiz = filho;
  208.     }
  209.    
  210.     public void zig_Zig_Right( No filho ) {
  211.         // Guardo o Pai, Avo e os Filhos da direita de filho e de pai
  212.         No pai = filho.getPai();
  213.         No avo = pai.getPai();
  214.         No B = filho.getDireita();
  215.         No C = pai.getDireita();
  216.         No bisavo = avo.getPai();
  217.        
  218.         // Mudo o pai e o filho direito de filho
  219.         filho.setPai( bisavo );
  220.         filho.setDireita( pai );
  221.        
  222.         // Mudo o pai e os filhos de pai
  223.         pai.setPai( filho );
  224.         pai.setEsquerda( B );
  225.         pai.setDireita( avo );
  226.        
  227.         // Mudo o pai e o filho esquerda de avo
  228.         avo.setPai( pai );
  229.         avo.setEsquerda( C );
  230.        
  231.         // Atualizo os pais de B e C
  232.         if ( B != null )
  233.             B.setPai( pai );
  234.         if ( C != null )
  235.             C.setPai( avo );
  236.        
  237.         // Se tiver bisavo:
  238.         if ( bisavo != null ) {
  239.             // Se o avo for o filho Esquerdo de Bisavo:
  240.             if ( bisavo.getEsquerda().equals( avo ) ) {
  241.                 bisavo.setEsquerda( filho );
  242.             // Se nao, o avo é filho Direito do Bisavo:
  243.             } else {
  244.                 bisavo.setDireita( filho );
  245.             }
  246.         // Se não tiver bisavo, é porque o avo era a raiz. Atualiz a raiz:
  247.         } else {
  248.             raiz = filho;
  249.         }
  250.     }
  251.    
  252.     public void zig_Zig_Left( No filho ) {
  253.         // Guardo o Pai, Avo e os Filhos da direita de filho e de pai
  254.         No pai = filho.getPai();
  255.         No avo = pai.getPai();
  256.         No bisavo = avo.getPai();
  257.         No B = pai.getEsquerda();
  258.         No C = filho.getEsquerda();
  259.        
  260.         // Mudo o pai e o filho esquerda de filho
  261.         filho.setPai( bisavo );
  262.         filho.setEsquerda( pai );
  263.        
  264.         // Mudo o pai e os filhos de pai
  265.         pai.setPai( filho );
  266.         pai.setEsquerda( avo );
  267.         pai.setDireita( C );
  268.  
  269.         // Mudo o pai e o filho direita de avo
  270.         avo.setPai( pai );
  271.         avo.setDireita( B );
  272.        
  273.         // Atualizo os pais de B e C
  274.         if ( C != null )
  275.             C.setPai( pai );
  276.         if ( B != null )
  277.             B.setPai( avo );
  278.        
  279.         // Se tiver bisavo:
  280.         if ( bisavo != null ) {
  281.             // Se o avo for o filho Esquerdo de Bisavo:
  282.             if ( bisavo.getEsquerda().equals( avo ) ) {
  283.                 bisavo.setEsquerda( filho );
  284.             // Se nao, o avo é filho Direito do Bisavo:
  285.             } else {
  286.                 bisavo.setDireita( filho );
  287.             }
  288.         // Se não tiver bisavo, é porque o avo era a raiz. Atualiz a raiz:
  289.         } else {
  290.             raiz = filho;
  291.         }
  292.     }
  293.    
  294.     public void zig_Zag_Right( No filho ) {
  295.         // Guardo o Pai, Avo e os Filhos da direita de filho e de pai
  296.         No pai = filho.getPai();
  297.         No avo = pai.getPai();
  298.         No bisavo = avo.getPai();
  299.         No B = filho.getEsquerda();
  300.         No C = filho.getDireita();
  301.  
  302.         // Muda o pai e os filhos de filho
  303.         filho.setPai( avo.getPai() );
  304.         filho.setEsquerda( pai );
  305.         filho.setDireita( avo );
  306.        
  307.         //  Muda o pai e o filho direita de pai
  308.         pai.setPai( filho );
  309.         pai.setDireita( B );
  310.        
  311.         // Mudo o pai e o filho esquerda de avo
  312.         avo.setPai( filho );
  313.         avo.setEsquerda( C );
  314.        
  315.         // Atualizo os pais de B e C
  316.         if ( B != null )
  317.             B.setPai( pai );
  318.         if ( C != null )
  319.             C.setPai( avo );
  320.        
  321.         // Se tiver bisavo:
  322.         if ( bisavo != null ) {
  323.             // Se o avo for o filho Esquerdo de Bisavo:
  324.             if ( avo.equals( bisavo.getEsquerda() ) ) {
  325.                 bisavo.setEsquerda( filho );
  326.             // Se nao, o avo é filho Direito do Bisavo:
  327.             } else {
  328.                 bisavo.setDireita( filho );
  329.             }
  330.         // Se não tiver bisavo, é porque o avo era a raiz. Atualiz a raiz:
  331.         } else {
  332.             raiz = filho;
  333.         }
  334.     }
  335.    
  336.     public void zig_Zag_Left( No filho ) {
  337.         // Guardo o Pai, Avo e os Filhos da direita de filho e de pai
  338.         No pai = filho.getPai();
  339.         No avo = pai.getPai();
  340.         No bisavo = avo.getPai();
  341.         No B = filho.getEsquerda();
  342.         No C = filho.getDireita();
  343.        
  344.         // Muda o pai e os filhos de filho
  345.         filho.setPai( avo.getPai() );
  346.         filho.setEsquerda( avo );
  347.         filho.setDireita( pai );
  348.        
  349.         // Mudo o pai e o filho esquerda de pai
  350.         pai.setPai( filho );
  351.         pai.setEsquerda( C );
  352.        
  353.         // Mudo o pai e o filho direita de avo
  354.         avo.setPai( filho );
  355.         avo.setDireita( B );
  356.        
  357.         // Atualizo os pais de B e C
  358.         if ( C != null )
  359.             C.setPai( pai );
  360.         if ( B != null )
  361.             B.setPai( avo );
  362.        
  363.         // Se tiver bisavo:
  364.         if ( bisavo != null ) {
  365.             // Se o avo for o filho Esquerdo de Bisavo:
  366.             if ( avo.equals( bisavo.getEsquerda() ) ) {
  367.                 bisavo.setEsquerda( filho );
  368.             // Se nao, o avo é filho Direito do Bisavo:
  369.             } else {
  370.                 bisavo.setDireita( filho );
  371.             }
  372.         // Se não tiver bisavo, é porque o avo era a raiz. Atualiz a raiz:
  373.         } else {
  374.             raiz = filho;
  375.         }
  376.     }
  377.  
  378. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement