Questione : Errori logici dell'albero binario del Java

Comprendo qui il codice per un albero binario. Ci sono parecchi problemi con il codice. L'albero è inizialmente vuoto, quindi i valori sono inseriti. Il primo valore sarà alla parte superiore. Il valore seguente sarà dalla parte di sinistra di primi valori se è più piccolo allora il primo valore. Sarà disposto dalla parte di destra se è più grande allora il valore iniziale. Questo valore sarà il primo nodo di bambino di valori ed il primo valore sarà il relativo genitore. Quando un valore ha sia un nodo di bambino di sinistra che giusto, quei nodi genereranno ancora i nuovi nodi di bambino dalla stessa logica quando i nuovi valori sono inseriti nell'albero. In questo esempio I utilizzerà i valori 1 3 4 10 12 13 14 15 16 20 21 28 29 30 39. Allora cancellerò il valore 10 e vedo se posso riorganizzare correttamente l'albero. L'albero iniziale è supposto per assomigliare a come nella la figura A.

1) quando cancello il nodo con il valore 10 io seguire la logica visualizzata nella la figura B. Tutto sembra funzionare BENE e tutti i numeri che rimangono sono visualizzati, ma quando cerca tutti i valori, il meccanismo sembra segnalare che alcuni dei numeri manchino. Subito dopo l'elenco loro nell'ordine. Esempio:

" l'albero in un'esposizione fascicolata: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Is 3 nell'albero: true
Is 4 nell'albero: true
Is 1 nell'albero: true
Is 10 nell'albero: false
Is 12 nell'albero: false
Is 13 nell'albero: false
Is 14 nell'albero: true
Is 16 nell'albero: true
Is 20 nell'albero: true
Is 21 nell'albero: true
Is 28 nell'albero: true
Is 29 nell'albero: true
Is 30 nell'albero: true
Is 39 nell'albero: " il

This accade soltanto quando cancella 10 (nodo di bambino della parte di sinistra), ma non 28 (nodo di bambino della parte di destra). il

2) l'ordine dei numeri sembra ottenere manipolato intorno dopo l'omissione. Non ho potuto calcolare fuori perché. Dopo la cancellazione del nodo con il valore 10, ottengo questo ordine: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Here potete vedere che 14 sono disposti male. Ciò non accade quando cancellano nodo con valore 28.

Figure A: nome di schedario " " vuoto " >

FigA.png " fileSize " > (21 Kb) il Javascript " del href= " " dei attachmentDetails del class= di (tipo di lima particolari) larghezza dello style= del >


Figure B del >
FigB.png " fileSize " > (27 Kb) il Javascript " del href= " " dei attachmentDetails del class= di (tipo di lima particolari) larghezza dello style= del >


When del >
We simulando l'omissione di 28.
A) 29 prende 28's place.
B) che chiediamo al nodo a 29 per trovare un nuovo spazio per 20.

Then simuliamo l'omissione di 10.
I) 14 prendiamo 10 place.
II) chiediamo a 14 per trovare il nuovo spazio per logica di 3.

The siamo gli stessi in entrambi gli esempi, solo trattando i lati differenti di un nodo dato (secondo che lato il nodo è su quello sta cancellando). class= > " libero " del
> " del codeSnippet " del class= del
class= " lineNumbers " del
class= del
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
sotto-albero notpretty dei >class " del class= " " di codeSnippet781788 del id= del
= di valore) {
      se (leftTree! = posizione di segnale minimo) {
        leftTree.insertValue (newValue);
      } altrimenti {
        leftTree = nuovo sotto-albero (newValue, questo);
      }
    } altrimenti {
      se (rightTree! = posizione di segnale minimo) {
        rightTree.insertValue (newValue);
      } altrimenti {
        rightTree = nuovo sotto-albero (newValue, questo);
      }
    }
  }

  stringa pubblica che toString () {
    Stringa che returString = "";
    se (leftTree! = posizione di segnale minimo) {
      returString = leftTree.toString () + ““;
    }
    returString = returString + valore;
    se (rightTree! = posizione di segnale minimo) {
      returString = returString + ““+ rightTree.toString ();
    }
	showObject ();
    returString di ritorno;
  }

  lookForValue booleano pubblico (søkeVerdi di int) {
    se (valore del == di søkeVerdi) {
      di ritorno allineare;
    }
    se (valore > søkeVerdi) {
      se (leftTree! = posizione di segnale minimo) {
        leftTree.lookForValue di ritorno (søkeVerdi);
      } altrimenti {
        falso di ritorno;
      }
    } altrimenti {
      se (rightTree! = posizione di segnale minimo) {
        rightTree.lookForValue di ritorno (søkeVerdi);
      } altrimenti {
        falso di ritorno;
      }
    }
  }
  
  deleteValue booleano pubblico (valore di int) {
    se (valore del == di this.value) {
	//If abbiamo trovato il nodo con il giusto valore, noi dobbiamo trovare se ha qualunque nodi di bambino
	  se ((&& di posizione di segnale minimo del == di rightTree) (posizione di segnale minimo del == di leftTree)) {
	    /** Questo nodo non ha bambino, esso può essere collegato fuori dal tree.*/
		se (<= this.parent.getValue di valore ()) {//We è dalla parte di sinistra e rieffettueremo il collegamento là al genitore
			this.parent.relink (0, posizione di segnale minimo);
		} altrimenti {//We è dalla parte di destra e rieffettuiamo il collegamento là al genitore
			this.parent.relink (1, posizione di segnale minimo);
		}
		//At l'estremità rieffettuiamo il collegamento questo backreference degli oggetti per parent:
		this.parent = posizione di segnale minimo;
		di ritorno allineare;
	  } altrimenti se (((&& di posizione di segnale minimo del == di rightTree) (leftTree! = posizione di segnale minimo)) || ((rightTree! = && di posizione di segnale minimo) (posizione di segnale minimo del == di leftTree))) {
	    /** Il nodo ha soltanto un nodo di bambino. Ci colleghiamo sopra questo nodo al bambino */
		se (<= this.parent.getValue di valore ()) {//We è dalla parte di sinistra e ci colleghiamo là sopra questo oggetto a questo rightTree degli oggetti
			se ((rightTree! = && di posizione di segnale minimo) (posizione di segnale minimo del == di leftTree)) this.parent.relink (0, this.rightTree);
			se ((&& di posizione di segnale minimo del == di rightTree) (leftTree! = posizione di segnale minimo)) this.parent.relink (0, this.leftTree);
			this.rightTree = posizione di segnale minimo;
		} altrimenti {//Or altrimenti siamo dalla parte di destra e ci colleghiamo là sopra questo oggetto a questo leftTree degli oggetti
			se ((rightTree! = && di posizione di segnale minimo) (posizione di segnale minimo del == di leftTree)) this.parent.relink (1, this.rightTree);
			se ((&& di posizione di segnale minimo del == di rightTree) (leftTree! = posizione di segnale minimo)) this.parent.relink (1, this.leftTree);
			this.leftTree = posizione di segnale minimo;
		}
		//At l'estremità rieffettuiamo il collegamento questo riferimento degli oggetti al genitore:
		this.parent = posizione di segnale minimo;
		di ritorno allineare;
	  } altrimenti {
	    /** Il noden ha due nodi di bambino, questi devono mosso correttamente e disposto correttamente nell'ambito del nodo del genitore */
		se (<= this.parent.getValue di valore ()) {//We è dalla parte di sinistra, noi collega il giusto nodo di bambino dalla parte di sinistra al genitore
			//We allora chiede al giusto nodo di bambino di trovare il nuovo spazio per il childnode di sinistra
			this.parent.relink (0, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = posizione di segnale minimo;
			this.leftTree = posizione di segnale minimo;
			this.parent = posizione di segnale minimo;
		} altrimenti {//Or altrimenti siamo dalla parte di destra e colleghiamo il giusto nodo di bambino dalla parte di destra al genitore
			this.parent.relink (1, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = posizione di segnale minimo;
			this.leftTree = posizione di segnale minimo;
			this.parent = posizione di segnale minimo;
		}
		this.parent = posizione di segnale minimo;
		di ritorno allineare;
	  }
	} altrimenti {
	//If non abbiamo foumd il nodo con il valore corretto, cercheremo la nota corretta del bambino ed osserveremo là:
	  se (this.value < valore) {
	    se (rightTree! = posizione di segnale minimo) rightTree.deleteValue (valore);
	  } altrimenti {
	    se (leftTree! = posizione di segnale minimo) leftTree.deleteValue (valore);
	  }
	}
    falso di ritorno;
  }
  getValue pubblico di int () {
    this.value di ritorno;
  }
  il vuoto del pubblico rieffettua il collegamento (int i, sotto-albero t) {
    se (i > 0) {
	  this.rightTree = t;
	} altrimenti {
	  this.leftTree = t;
	}
	t.setNewParent (questo);
  }
  getChildNode pubblico del sotto-albero (int i) {
    se (i > 0) {
	  this.rightTree di ritorno;
	} altrimenti {
	  this.leftTree di ritorno;
	}
  }
  giveNewPlace vuoto del pubblico (sotto-albero t) {
	Sotto-albero t di //Takes e prove per dargli un nuovo posto nell'albero
    //Check se questo nodo ha spazio per un nodo di bambino di sinistra, se non:
    //Check se questo nodo ha spazio per un giusto nodo di bambino ed ordina i due childnodes corretti, se non:
    //Ask il childNode di sinistra seguente per dare nuovo posto con il relativo giveNewPlace ().
	se (posizione di segnale minimo del == di this.leftTree) {
		this.leftTree = t;
		t.setNewParent (questo);
	} altrimenti se (posizione di segnale minimo del == di this.rightTree) {
		se (getValue () < t.getValue ()) {
			this.rightTree = t;
			t.setNewParent (questo);
		} altrimenti {
			this.rightTree = this.leftTree;
			this.leftTree = t;
			t.setNewParent (questo);
		}
	} altrimenti {
		this.leftTree.giveNewPlace (t);
	}
  }
  setNewParent vuoto del pubblico (sotto-albero t) {
	this.parent = t;
  }
  showObject vuoto del pubblico () {
	System.out.println (“----------------------------------------");
	se (genitore! = posizione di segnale minimo) System.out.println (“genitore: „ + parent.getValue ());
    System.out.println (“*Value: „ + this.value);
    se (rightTree! = posizione di segnale minimo) System.out.println (“bambino di destra: „ + rightTree.getValue ());
    se (leftTree! = posizione di segnale minimo) System.out.println (“bambino lasciato: „ + leftTree.getValue ());
	System.out.println (“----------------------------------------");
  }
}

codice categoria BinarySeekingTree {
  putrefazione riservata del sotto-albero;
  stringa pubblica che toString () {
    se (putrefazione! = posizione di segnale minimo) {
      rot.toString di ritorno ();
    } altrimenti {
      posizione di segnale minimo di ritorno;
    }
  }

  insertValue vuoto del pubblico (valore di int) {
    se (putrefazione! = posizione di segnale minimo) {
      rot.insertValue (valore);
    } altrimenti {
      putrefazione = nuovo sotto-albero (valore, posizione di segnale minimo);
    }
  }
  
  deleteValue booleano pubblico (valore di int) {
	//If là è radice nell'albero, quindi non ci è il valore da cancellare
    se (posizione di segnale minimo del == della putrefazione) {
	  falso di ritorno;
	} altrimenti {
	  se (rot.deleteValue (valore)) {
	    di ritorno allineare;
	  } altrimenti {
	    falso di ritorno;
	  }
	}
  }

  lookForValue booleano pubblico (søkeVerdi di int) {
    se (posizione di segnale minimo del == della putrefazione) {
      falso di ritorno;
    }
    rot.lookForValue di ritorno (søkeVerdi);
  }
}

ricerca del codice categoria {
	vuoto pubblico di elettricità statica principale (args della stringa []) {
		Albero di BinarySeekingTree = nuovo BinarySeekingTree ();
		tree.insertValue (15);
		tree.insertValue (10);
		tree.insertValue (28);
		tree.insertValue (3);
		tree.insertValue (14);
		tree.insertValue (20);
		tree.insertValue (29);
		tree.insertValue (1);
		tree.insertValue (4);
		tree.insertValue (12);
		tree.insertValue (13);
		tree.insertValue (16);
		tree.insertValue (21);
		tree.insertValue (30);
		tree.insertValue (39);
		System.out.println (“l'albero in un'esposizione fascicolata: „ + tree.toString ()); //Sorting viene a mancare dopo la cancellazione dell'oggetto
		System.out.println (“sono 3 nell'albero: „ + tree.lookForValue (3));
		System.out.println (“sono 4 nell'albero: „ + tree.lookForValue (4));
		System.out.println (“è 1 nell'albero: „ + tree.lookForValue (1));
		System.out.println (“sono 10 nell'albero: „ + tree.lookForValue (10));
		System.out.println (“sono 12 nell'albero: „ + tree.lookForValue (12));
		System.out.println (“sono 13 nell'albero: „ + tree.lookForValue (13));
		System.out.println (“sono 14 nell'albero: „ + tree.lookForValue (14));
		System.out.println (“sono 16 nell'albero: „ + tree.lookForValue (16));
		System.out.println (“sono 20 nell'albero: „ + tree.lookForValue (20));
		System.out.println (“sono 21 nell'albero: „ + tree.lookForValue (21));
		System.out.println (“sono 28 nell'albero: „ + tree.lookForValue (28));
		System.out.println (“sono 29 nell'albero: „ + tree.lookForValue (29));
		System.out.println (“sono 30 nell'albero: „ + tree.lookForValue (30));
		System.out.println (“sono 39 nell'albero: „ + tree.lookForValue (39));
		System.out.println (“ora proviamo a cancellare il valore 10 dall'albero, ma non 28.");
		tree.deleteValue (10);
		//tree.deleteValue (28);
		System.out.println ("");
	System.out.println (“l'albero in un'esposizione fascicolata: „ + tree.toString ()); //Sorting viene a mancare dopo la cancellazione dell'oggetto
		System.out.println (“sono 3 nell'albero: „ + tree.lookForValue (3));
		System.out.println (“sono 4 nell'albero: „ + tree.lookForValue (4));
		System.out.println (“è 1 nell'albero: „ + tree.lookForValue (1));
		System.out.println (“sono 10 nell'albero: „ + tree.lookForValue (10));
		System.out.println (“sono 12 nell'albero: „ + tree.lookForValue (12));
		System.out.println (“sono 13 nell'albero: „ + tree.lookForValue (13));
		System.out.println (“sono 14 nell'albero: „ + tree.lookForValue (14));
		System.out.println (“sono 16 nell'albero: „ + tree.lookForValue (16));
		System.out.println (“sono 20 nell'albero: „ + tree.lookForValue (20));
		System.out.println (“sono 21 nell'albero: „ + tree.lookForValue (21));
		System.out.println (“sono 28 nell'albero: „ + tree.lookForValue (28));
		System.out.println (“sono 29 nell'albero: „ + tree.lookForValue (29));
		System.out.println (“sono 30 nell'albero: „ + tree.lookForValue (30));
		System.out.println (“sono 39 nell'albero: „ + tree.lookForValue (39));
	}
}
class= del

Risposta : Errori logici dell'albero binario del Java

Il vostro codice funzionerebbe correttamente se l'albero rimanesse equilibrato dopo l'omissione. La causa principale del vostro problema è spiegata qui sotto:
Qui è il sotto-albero di sinistra dopo che rimuovete il nodo con il valore 10.

                                            14
                                           /\
                                         3 12
                                        /\ \
                                      1 4 13

Se vogliamo trovare il nodo con il valore 12, secondo il vostro codice i 12 sono paragonati a 14. Se i 12 <� 14="">per risolvere il problema voi mantengono l'albero equilibrato.
Altre soluzioni  
 
programming4us programming4us