• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Drzewa BST java

Object Storage Arubacloud
0 głosów
1,453 wizyt
pytanie zadane 19 grudnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)

Witam mam napisac program który implementuje drzewa BST jednakże jest to zadanie na studia więc jest z góry narzucona struktura kodu mianowicie 




public abstract class BinaryTreeNode {
    
    //wartosc w wezle
    protected int dane;
    //prawe i lewe poddrzewo
    protected BinaryTreeNode lewy, prawy;

    public BinaryTreeNode(int dane) {
        this.dane = dane;
    }
    
/* Wypisuje drzewo np. dla drzewa
        8
    3       5
 2    1  4    0 
 wypisac:
        2
     3
        1
  8
        4
     5
        0
wypisz lewe
wypisz odstep, wypisz dane, endl
wypisz prawe
 */
    public abstract void print(int poziom);
       
  
//rekurencyjne przeszukuje drzewo BST, zwraca true, jesli znajdzie element o podanej wartosci   
    public abstract boolean searchBSTRec(int szukany);
    
//rekurencyjnie dodaje element do drzewa BST
    public abstract void addBSTRec(int nowy);
    
//zwraca pare: wezel zawierajacy poszukiwany element oraz jego poprzednika
//jesli szukanego elementu nie ma w drzewie, to pierwszym elementem pary jest null
//jesli pierwszy element pary jest korzeniem (nie ma poprzednika), to drugim elementem pary jest null    
    public abstract Pair < BinaryTreeNode, BinaryTreeNode > searchBST(int szukany);    
    
 
}


i mam napisac metode która doda mi element do drzewa naskrobałem tyle i zatrzymałem się bo nie wiem kiedy mam dodawać na prawą strone drzewa a kiedy na lewą 

o oto co napisałem sam 

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package drzewabst;

/**
 *
 * @author Patryk
 */
public class Lab8 extends BinaryTreeNode{

    private Lab8 korzen = null;
    
    public Lab8(int dane) {
        super(dane);
  
    }

    @Override
    public void addBSTRec(int nowy) {
      if(korzen == null){
          korzen = new Lab8(nowy);
      }
// tu nie wiem kiedy dodawać na prawą strone drzewa a kiedy na lewa 
    }


    
}

może mi ktoś pomóc naprowadzić ?

1 odpowiedź

0 głosów
odpowiedź 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
Drzewo BST działa tak że na lewo masz dane mniejsze od korzenia a na prawo masz dane wieksze. W twoim wypadku najlepiej porównywać nowy z dane a nastepnie sprawdzac czy lewy/prawy jest nullem. Jak tak to tworzysz jak nie rekurencyjnie wywołujesz dodanie.
komentarz 19 grudnia 2016 przez Patryk Rafał Bywalec (2,700 p.)
 @Override
    public void addBSTRec(int nowy) {
        Lab8 pom = null;
        if(this.korzen == null){
            this.korzen = new Lab8(nowy);
            this.korzen.lewy = null;
            this.korzen.prawy = null;
        }else{
            pom = new Lab8(nowy);
            if(pom.dane < this.korzen.dane){
                this.korzen.lewy = new Lab8(nowy);
            }else{
                this.korzen.prawy = new Lab8(nowy);
            }
            
        }
        
     }

o to chodziło ?

 

komentarz 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
edycja 19 grudnia 2016 przez Mateusz51

Nie do końca. Popierwsze po co tworzysz pom jeśli potem i tak tworzysz nowe Lab8.

To o co mi chodziło to raczej powinno wygladać tak.

else{
           
            if(nowe < this.korzen.dane){
               if(korzen.lewy==null) this.korzen.lewy = new Lab8(nowy);
               else korzen.lewy.addBSTRec(nowy);
            }else{
               if(korzen.prawy==null) this.korzen.prawy = new Lab8(nowy);
               else korzen.prawy.addBSTRec(nowy);
            }
             
        }

 

komentarz 19 grudnia 2016 przez Patryk Rafał Bywalec (2,700 p.)
dzięki kolego naprowadziłeś mnie, jednakże mam teraz kolejny problem mam to wypisać w taki sposób

* Wypisuje drzewo np. dla drzewa
        8
    3       5
 2    1  4    0
 wypisac:
        2
     3
        1
  8
        4
     5
        0
wypisz lewe
wypisz odstep, wypisz dane, endl
wypisz prawe
 */

jak uzyskać taki efekt ?
komentarz 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
wypisz lewe
wypisz odstep, wypisz dane, endl
wypisz prawe :)

Rekurencyjnie wywołujesz

Coś w tym stylu. Tylko musisz pobawić się jakos z spacjami:)

void wypiszDane(){

if(lewy!=null)lewy.wypiszDane()

System.out.println(" " + dane);

if(prawy!=null) prawy,wypiszDane();

}
komentarz 19 grudnia 2016 przez Patryk Rafał Bywalec (2,700 p.)

zrobiłem jak mi poradziłeś jednakże nie działa mi to dobrze

 @Override
    public void print(int poziom) {
      
       if(this.lewy != null)this.korzen.lewy.print(poziom); 
           System.out.print(this.korzen.lewy.dane + " ");
       
       
        if(this.prawy != null)this.korzen.prawy.print(poziom); 
            System.out.print(this.korzen.prawy.dane + " ");
        
       
      System.out.println();
       
    }


  @Override
    public void addBSTRec(int nowy) {
        if(this.korzen == null){
            this.korzen = new Lab8(nowy);
            this.korzen.lewy = null;
            this.korzen.prawy = null;
        }else{
            if(nowy < this.korzen.dane){
                if(this.korzen.lewy == null)this.korzen.lewy = new Lab8(nowy);
                else this.korzen.lewy.addBSTRec(nowy);
                this.print(this.korzen.lewy.dane);
            }else{
                if(this.korzen.prawy == null) this.korzen.prawy = new Lab8(nowy);
                else this.korzen.prawy.addBSTRec(nowy); 
                this.print(this.korzen.prawy.dane);
            }
        }
     
     }

 

komentarz 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
Nie wiem dlaczego robisz printa w dodawaniu, mi wydaje się że jest to nie potrzebne. No ale jeśli chodzi o funkcie print to nei tak ją sobie wyobrażałem. Nie wypisujesz danych z korzenia tylko z dzieci. A dzieci powinny same sobie wypisywać dane, po ich rekurencyjnym wywołaniu.
komentarz 19 grudnia 2016 przez Patryk Rafał Bywalec (2,700 p.)
to jak mam to niby wyświetlać ?
komentarz 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
@Override
   public void print(int poziom) {
      
      if(this.lewy != null)this.korzen.lewy.print(poziom+1);        
      for(int n =0; n<poziom; n++) System.out.print(" ");
      System.out.println(dane);
      if(this.prawy != null)this.korzen.prawy.print(poziom+1);      
   }
 

Ja bym to jakoś tak zrobił. 

A wyświetlanie drzewa zaczynasz od korzenia na którym wykonujesz print(0)

komentarz 19 grudnia 2016 przez Patryk Rafał Bywalec (2,700 p.)
wybacz kolego faktycznie xd
komentarz 19 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
A jak jest?

Podobne pytania

0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 28 listopada 2023 w C i C++ przez natalia2002. Początkujący (400 p.)
0 głosów
1 odpowiedź 315 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 739 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)

92,631 zapytań

141,492 odpowiedzi

319,862 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...