Jeg vil slet en Pesons navn ved BinærSøgtræ. Jeg sletter Person ved at lægger alle Person element i et array og slet navn og sætter elementer(inorder) ind i trær igen. dvs. reorganiserer binærtrær, men jeg kan ikke slet navn, som ikke er blade.Jeg ved ikke hvad der er gal med mine kode. private String[] array; private int index;
public void balancer(){ array= new String[index-1]; index= 0; indsaetInorderIArray(rod); rod= genopbygTrae(0, array.length-1,null); }
Det er skørt fordi du laver en hel kopi af træet med alle navne. Man kan jo godt slette en knude i et søgetræ uden det.
Nej, min løsning er ikke helt nok. Men kan du se at du skal kopiere alle elementer til højre for det fundne en gang til venstre. Dermed bliver dit array én mindre (målt med index). Og det er ikke det du gør.
Du får hjælp til selvhjælp. Prøv at tage din sletNavn ud i en separat klasse, og eksperimenter med den til den virker. Dvs. put kendte navne i, slet ét, og med udskrfter undervejs se hvad der sker. Det er bedre du gør det, end at jeg gør. Jeg kan nemlig godt hvis jeg gider :) Du skal lære det.
Jeg har en udtag metode som er public void udtag(String s) { udtag_hjaelpemetode(s, rod); } private void udtag_hjaelpemetode(String s, Person p) { try{ if(p!=null) { if(p.vson.navn.compareTo(s)==0) p.vson=null; else if(p.hson.navn.compareTo(s)==0) p.hson=null; udtag_hjaelpemetode(s, p.vson); udtag_hjaelpemetode(s, p.hson); } } catch(Exception e){} } jeg kan godt slette en blade med ikke sønner. så finder jeg sletNavn() til at slette sønner inden in et array, men det virker ikke!!! ok! jeg giver op nu! godnat!
Ryst hovedet godt inden du går i gang igen. Du blander mange ting sammen - og det vigtigste er at du ved hvad du vil, næstvigtigst hvordan det skal se ud i Java.
Hvordan blander jeg mange ting samme? hvis jeg har udtag() så skal jeg faktisk ikke have sletNavn(), men hvordan kan jeg slette Person navn, når den ikke er blade?
Du skal ikke tro du er i gang med at lære Java, du er i gang med at lære at programmere. Og det handler om at tænke logisk - og i passende små skridt.
Lad mig lave en sletNavn til dig som eksempel - altså slette et navn i en liste. Men jeg vil altså bruge en ArrayList i stedet for et array. Det er smartere. 2 secs
Jeg har lavet en slet metoder. public void sletNavn(Person p){ try{ for(int i=0; i <array.length; i++){ if(p.navn.compareTo(array[i])==0) { array[i]= array[i+1]; index--; } } } catch(Exception a){} } det er måske forkert!
Ja, du flytter kun én gang. Jeg ved ikke om du skal bruge et array, men se her et eksempel på brugen af ArrayList. Det er et færdigt program, der kører:
import java.util.*;
public class SletEtNavn {
static ArrayList liste = new ArrayList();
public static void sletNavn(ArrayList liste,String navn){ boolean found=false; int i=0; while (!found && i<liste.size()) { if (navn.equals((String)liste.get(i))) { found=true; } else { i++; } } if (found) { liste.remove(i); } }
public static void main(String args[]) { liste.add("Peter"); liste.add("Poul"); liste.add("Børge");
tak! Men jeg skal slette en navn fra binærTræ. Jeg tænker om at jeg kan flytte alle navn til et array( inorder) og slet en pågælende navn, og genopbygge en trær igen. Dvs, da jeg sletter en, som ikke er blade, så skal jeg reorganiserer træet.
Det er præcis det jeg hjælper dig med. Men det er for besværligt at bruge et array. Flyt dem til en ArrayList, slet navnet, og byg træet op igen. Kan du ikke se at mit lille eksempel kan hjælpe dig på vej?
} /******* tael om hvor mange element i trae **********/ public int antal() { return tael(rod); } public int tael(Person p) { if(p==null) return 0; return 1+ tael(p.vson)+ tael(p.hson); } /********** balancer træ ***************/ private String[] array; private int index; private int ctr;
public void balancer(Person px){ ctr= antal()-1; array= new String[ctr]; index= 0; indsaetInorderIArray(rod); udtag(px); rod= genopbygTrae(0, ctr-1, null ); rod= actuel= null; //slet den gammel træ }
Du kigger på alle elementer med for-løkken, ok. Finder du navnet, flytter du det efterfølgende navn én frem, og det er såmænd godt nok, men du gør det ikke for alle efterfølgende navne i dit array. Endvidere rammer du ved siden af, hvis du fandt navnet som det sidste,
Jeg har ikke styret på ArrayList. Nu skal jeg læse java dokumentation for at finde ud af at indsætte alle personer i liste. men jeg vil stadigvæk prøve at få min gamle program virker.
Hej! Jeg bruger ArrayList, men det virker stadigvæk ikke rigtig. Kan du se fejlen i de nye koder? public void udtag(Person p) { if(p.navn.compareTo(actuel.navn)==0) { sletNavn(liste, p.navn); } else{ udtag_hjaelpemetode(p.navn, rod);} } private void udtag_hjaelpemetode(String s, Person p) { try{ if(p!=null) { if(p.vson.navn.compareTo(s)==0) p.vson=null; else if(p.hson.navn.compareTo(s)==0) p.hson=null; udtag_hjaelpemetode(s, p.vson); udtag_hjaelpemetode(s, p.hson); } } catch(Exception e){} } /******* tael om hvor mange element i trae **********/ public int antal() { return tael(rod); } public int tael(Person p) { if(p==null) return 0; return 1+ tael(p.vson)+ tael(p.hson); } /********** balancer træ ***************/ private ArrayList liste ;
public void balancer(Person px, String s){ ArrayList liste = new ArrayList(); liste.add(px); sletNavn(liste, s); rod= genopbygTrae(0, liste.size(), null ); rod= actuel= null; //slet den gammel træ } public void sletNavn(ArrayList liste,String navn){ boolean found=false; int i=0; while (!found && i<liste.size()) { if (navn.equals((String)liste.get(i))) { found=true; } else { i++; } } if (found) { liste.remove(i); } } private Person genopbygTrae(int v, int h, Person far){ Person p= null; if(v<=h){ p= new Person(" "); p.navn= (String)liste.get((v+ h)/2); p.far = far; p.vson= genopbygTrae(v, (v+ h)/2-1, p); p.hson= genopbygTrae((v+ h)/2+1, h, p); } return p; } }
og i stedet indsætte alle Personer i arrayet, indsætter jeg kun de navne, som ikke bliver slettet. men jeg fik de samme resultater som jeg bruger ArrayList. public void indsaetInorderIArray(String s, Person p){
Ja ! Jeg har rettet kode, derfor lykkes det for mig at udtage et navn. Nu har jeg oprettet en database hedder "Anetræ", men hvordan laver en gem metode så jeg kan gem persons oplysning ind i databases Person tabel?
Det er en trænings opgave fra skolen. Jeg vil sikre jeg kan løse eksamsopgave, den får jeg snart. Database: dvs. for enhver node gælder at dens venstre søn er persons biologisk mor, og at dens højre søn er personens biologisk far. Jeg skal lave et system med GUI, så bruger kan indsætte sine forældre på rigtig plads i træet, manøvrere gennem træet. Bruger kan gennem informationerne i træet i en database for programmet lukkes- og senere hente dem igen. Jeg har laver en database (vhaSqL-sætninger) som hedder AneTræ med en Tabel, som er Person med Persons CprNr, navn, FarsCprNr. Mit problem nu er at lave en metode, som kan gemme Persons oplysning i database, og en hente metode, som kan hente oplysninger.
Vi har lære om at gemme ting i en fil og læse fra filen igen. Men i denne opgave skal jeg gemme informationer i træet i en database og hentes dem igen.
en database som indholder en tabel, som hedder Person med Persons oplysninger. Og nu jeg finder jeg ud af min insætte metoder er forkert. Hvis "Bo" er barn, "Marie" og "Holger" er Bos mor og far, Så skrive jeg : if(rod==null) { rod=nyP; actuel= rod; } else { if(nyP.koen.equals("k")) { tilVenstre(); insert(nyP); } else{ tilHoejre(); insert(nyP); } men det virker ikke rigtig hvis jeg vil insert "Mette" og "Niels" som "Maris" mor og far.
oh nej! Det er mig, som blandte tinge sammen. Jeg skal lave et genetisk anetræ, der indholder en persons biologisk forfædre. Jeg skal sætte persons forældre på korrekt plads i træet. dvs. Person har mor og far, mor har mor og far, og far har mor og far..... mor til venstre og far til højre, sådan bygger et anetræ. Databasen: at gemme informationerne i trætet i en database. Databasen er persons oplysnings database.
Jeg skal første bygge et anetræ, og gemme informationer i database(preorder), tøm træet, indlæse preordre fra databasen.
I Mocrisoft Access oprette en database med tabel hedder Person, Tabel person indholder persons CprNr(primær nøgler), navn, og fremmeId(fremmenøgler).
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.