Vraag : Logische Fouten van de Boom van Java de Binaire

Ik omvat hier de code voor een binaire boom. Er zijn verscheidene problemen met de code. De boom is eerst leeg, dan worden de waarden opgenomen. De eerste waarde zal bij de bovenkant zijn. De volgende waarde zal op de eerste waardenlinkerkant zijn als het kleiner is toen de eerste waarde. Het zal op de rechterkant worden geplaatst als het groter is toen de aanvankelijke waarde. Deze waarde zal de eerste knoop van het waardenkind zijn, en de eerste waarde zal zijn ouder zijn. Wanneer een waarde zowel een linkerzijde als een juiste kindknoop heeft, zullen die knopen opnieuw tot nieuwe kindknopen door de zelfde logica leiden wanneer de nieuwe waarden in de boom worden opgenomen. In dit voorbeeld 1 waarden 1 3 4 10 12 13 14 15 16 20 21 28 29 30 39 zal gebruiken. Ik zal dan waarde 10, schrappen en zal zien of kan ik de boom correct herschikken. De aanvankelijke boom is verondersteld die als zoals te kijken in figuur A.

1) wanneer ik de knoop met waarde 10 ik volg de logica schrap in figuur B. wordt getoond. Alles schijnt O.K. te werken, en alle aantallen die blijven worden getoond, maar wanneer het zoeken naar alle waarden, schijnt het mechanisme om te rapporteren dat enkele aantallen missen. Vlak na het een lijst maken van van hen in orde. Voorbeeld:

de " Boom in een gesorteerde vertoning: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Is 3 in de boom: true
Is 4 in de boom: true
Is 1 in de boom: true
Is 10 in de boom: false
Is 12 in de boom: false
Is 13 in de boom: false
Is 14 in de boom: true
Is 16 in de boom: true
Is 20 in de boom: true
Is 21 in de boom: true
Is 28 in de boom: true
Is 29 in de boom: true
Is 30 in de boom: true
Is 39 in de boom: ware "

This gebeurt wanneer slechts het schrappen van 10 (de knoop van het linkerkantkind), maar niet 28 (de knoop van het rechterkantkind).

2) de orde van de aantallen die rond wordt gejongleerd schijnt te worden met na schrapping. Ik heb niet waarom kunnen berekenen. Na het schrappen van knoop met waarde 10, krijg ik deze orde: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Here u kan zien dat 14 geplaatste verkeerd zijn. Dit gebeurt niet wanneer het schrappen van knoop met waarde 28.

Figure A: van


Figure B: van


When rechterkantknopen schrapt: />We het begin
A) 29 te simuleren neemt 28's place.
B) wij vraagt de knoop bij 29 om een nieuwe ruimte voor 20.

Then te vinden wij schrapping van 10.
I) 14 simuleren 10 place.
II) wij neemt vraagt 14 om nieuwe ruimte voor logica 3.

The te vinden het zelfde in beide voorbeelden zijn, slechts behandelend verschillende kanten van een bepaalde knoop (afhankelijk van welke kant de knoop op dat is wordt geschrapt).
" codeBody "
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:
van
class Onderverdeling {
  privé rightTree van de Onderverdeling = verklaart nietig;
  privé leftTree van de Onderverdeling = verklaart nietig;
  de privé ouder van de Onderverdeling = verklaart nietig;
  privé int.waarde = 0;

  openbare Onderverdeling (int.waarde) {
    this.value = waarde;
  }

  openbare Onderverdeling (int.waarde, de ouder van de Onderverdeling) {
    this.value = waarde;
    this.parent = ouder;
  }

  openbare nietige insertValue (int. newValue) {
    als (waarde >= newValue) {
      als (leftTree! = verklaar) nietig {
        leftTree.insertValue (newValue);
      } anders {
        leftTree = nieuwe Onderverdeling (newValue, dit);
      }
    } anders {
      als (rightTree! = verklaar) nietig {
        rightTree.insertValue (newValue);
      } anders {
        rightTree = nieuwe Onderverdeling (newValue, dit);
      }
    }
  }

  het openbare toString van het Koord () {
    Koord dat = "" returString;
    als (leftTree! = verklaar) nietig {
      het returString = leftTree.toString () + „„;
    }
    het returString = returString + waarde;
    als (rightTree! = verklaar) nietig {
      het returString = returString + „„+ rightTree.toString ();
    }
	showObject ();
    terugkeer het returString;
  }

  openbare lookForValue van Boole (int.søkeVerdi) {
    als (søkeVerdi== waarde) {
      ware terugkeer;
    }
    als (waarde > søkeVerdi) {
      als (leftTree! = verklaar) nietig {
        keer leftTree.lookForValue (søkeVerdi) terug;
      } anders {
        valse terugkeer;
      }
    } anders {
      als (rightTree! = verklaar) nietig {
        keer rightTree.lookForValue (søkeVerdi) terug;
      } anders {
        valse terugkeer;
      }
    }
  }
  
  openbare deleteValue van Boole (int.waarde) {
    als (waarde this.value ==) {
	//If hebben wij knoop met juiste waarde gevonden, moeten wij vinden als het om het even welke kindknopen heeft
	  als ((ongeldige rightTree ==) && (ongeldige leftTree ==)) {
	    /Heeft ** Deze knoop geen kind, kan het van tree.*/worden verbonden
		als (waarde <= this.parent.getValue ()) {//We is op linkerkant, en wij zullen daar bij de ouder opnieuw verbinden
			this.parent.relink (0, verklaren nietig);
		} anders {//We is op de rechterkant, en wij verbinden daar bij de ouder opnieuw
			this.parent.relink (1, verklaart nietig);
		}
		//At het eind verbinden wij dit objecten backreference aan ouder opnieuw:
		this.parent = verklaar nietig;
		keer waar terug;
	  } anders als (((ongeldige rightTree ==) && (leftTree! = verklaar)) nietig || ((rightTree! = verklaar) && (ongeldige leftTree ==) nietig)) {
	    /Heeft ** de knoop slechts één kindknoop. Wij verbinden over deze knoop met het kind */
		als (waarde <= this.parent.getValue ()) {//We is op linkerkant, en wij verbinden daar over dit voorwerp met dit objecten rightTree
			als ((rightTree! = verklaar) && (ongeldige leftTree ==) nietig) this.parent.relink (0, this.rightTree);
			als ((ongeldige rightTree ==) && (leftTree! = verklaar)) nietig this.parent.relink (0, this.leftTree);
			this.rightTree = verklaar nietig;
		} anders {//Or anders zijn wij op de rechterkant, en wij verbinden daar over dit voorwerp met dit objecten leftTree
			als ((rightTree! = verklaar) && (ongeldige leftTree ==) nietig) this.parent.relink (1, this.rightTree);
			als ((ongeldige rightTree ==) && (leftTree! = verklaar)) nietig this.parent.relink (1, this.leftTree);
			this.leftTree = verklaar nietig;
		}
		//At het eind verbinden wij deze objecten verwijzing naar de ouder opnieuw:
		this.parent = verklaar nietig;
		keer waar terug;
	  } anders {
	    /Noden ** heeft twee kindknopen, moeten deze correct bewogen en correct geplaatst onder de ouderknoop */
		als (waarde <= this.parent.getValue ()) {//We is op de linkerkant, verbinden wij juiste kindknoop op linkerkant bij de ouder
			//We vraagt dan de juiste kindknoop om nieuwe ruimte voor linkerchildnode te vinden
			this.parent.relink (0, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = verklaar nietig;
			this.leftTree = verklaar nietig;
			this.parent = verklaar nietig;
		} anders {//Or anders zijn wij op de rechterkant, en wij verbinden juiste kindknoop op de rechterkant bij de ouder
			this.parent.relink (1, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = verklaar nietig;
			this.leftTree = verklaar nietig;
			this.parent = verklaar nietig;
		}
		this.parent = verklaar nietig;
		keer waar terug;
	  }
	} anders {
	//If hebben wij foumd niet de knoop met de correcte waarde, zullen wij de correcte kindnota zoeken en zullen daar kijken:
	  als (this.value < waarde) {
	    als (rightTree! = verklaar) rightTree.deleteValue (waarde) nietig;
	  } anders {
	    als (leftTree! = verklaar) leftTree.deleteValue (waarde) nietig;
	  }
	}
    keer vals terug;
  }
  openbaar int. getValue () {
    terugkeer this.value;
  }
  de openbare leegte verbindt opnieuw (int. i, Onderverdeling t) {
    als (I > 0) {
	  this.rightTree = t;
	} anders {
	  this.leftTree = t;
	}
	t.setNewParent (dit);
  }
  openbare Onderverdeling getChildNode (int. i) {
    als (I > 0) {
	  terugkeer this.rightTree;
	} anders {
	  terugkeer this.leftTree;
	}
  }
  openbare nietige giveNewPlace (Onderverdeling t) {
	//Takes Onderverdeling t en pogingen om het een nieuwe plaats in de boom te geven
    //Check als deze knoop ruimte voor een linkerkindknoop, als niet heeft:
    //Check als deze knoop ruimte voor een juiste kindknoop heeft en tot twee correcte childnodes, als niet opdracht geeft:
    //Ask volgende linkerchildNode om nieuwe plaats met zijn giveNewPlace () te geven.
	als (ongeldige this.leftTree ==) {
		this.leftTree = t;
		t.setNewParent (dit);
	} anders als (ongeldige this.rightTree ==) {
		als (getValue () < t.getValue ()) {
			this.rightTree = t;
			t.setNewParent (dit);
		} anders {
			this.rightTree = this.leftTree;
			this.leftTree = t;
			t.setNewParent (dit);
		}
	} anders {
		this.leftTree.giveNewPlace (t);
	}
  }
  openbare nietige setNewParent (Onderverdeling t) {
	this.parent = t;
  }
  openbare nietige showObject () {
	System.out.println („“);
	als (ouder! = verklaar) System.out.println nietig („Ouder: “ + parent.getValue ());
    System.out.println („*Value: “ + this.value);
    als (rightTree! = verklaar) System.out.println nietig („Juist kind: “ + rightTree.getValue ());
    als (leftTree! = verklaar) System.out.println nietig („Linkerkind: “ + leftTree.getValue ());
	System.out.println („“);
  }
}

klasse BinarySeekingTree {
  de privé verrotting van de Onderverdeling;
  het openbare toString van het Koord () {
    als (verrotting! = verklaar) nietig {
      keer rot.toString () terug;
    } anders {
      ongeldige terugkeer;
    }
  }

  openbare nietige insertValue (int.waarde) {
    als (verrotting! = verklaar) nietig {
      rot.insertValue (waarde);
    } anders {
      verrotting = nieuwe Onderverdeling (de waarde, verklaart nietig);
    }
  }
  
  openbare deleteValue van Boole (int.waarde) {
	//If is er geen wortel in de boom, dan er geen te schrappen waarde is
    als (ongeldige verrotting ==) {
	  valse terugkeer;
	} anders {
	  als (rot.deleteValue (waarde)) {
	    ware terugkeer;
	  } anders {
	    valse terugkeer;
	  }
	}
  }

  openbare lookForValue van Boole (int.søkeVerdi) {
    als (ongeldige verrotting ==) {
      valse terugkeer;
    }
    terugkeer rot.lookForValue (søkeVerdi);
  }
}

de klasse zoekt {
	openbare statische nietige leiding (Koord [] args) {
		De boom van BinarySeekingTree = nieuwe 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 (de „Boom in een gesorteerde vertoning: “ + tree.toString ()); //Sorting ontbreekt na het schrappen van een voorwerp
		System.out.println („is 3 in de boom: “ + tree.lookForValue (3));
		System.out.println („is 4 in de boom: “ + tree.lookForValue (4));
		System.out.println („is 1 in de boom: “ + tree.lookForValue (1));
		System.out.println („is 10 in de boom: “ + tree.lookForValue (10));
		System.out.println („is 12 in de boom: “ + tree.lookForValue (12));
		System.out.println („is 13 in de boom: “ + tree.lookForValue (13));
		System.out.println („is 14 in de boom: “ + tree.lookForValue (14));
		System.out.println („is 16 in de boom: “ + tree.lookForValue (16));
		System.out.println („is 20 in de boom: “ + tree.lookForValue (20));
		System.out.println („is 21 in de boom: “ + tree.lookForValue (21));
		System.out.println („is 28 in de boom: “ + tree.lookForValue (28));
		System.out.println („is 29 in de boom: “ + tree.lookForValue (29));
		System.out.println („is 30 in de boom: “ + tree.lookForValue (30));
		System.out.println („is 39 in de boom: “ + tree.lookForValue (39));
		System.out.println („wij proberen nu om waarde 10 van de boom, maar niet 28 te schrappen. “);
		tree.deleteValue (10);
		//tree.deleteValue (28);
		System.out.println ("");
	System.out.println (de „Boom in een gesorteerde vertoning: “ + tree.toString ()); //Sorting ontbreekt na het schrappen van een voorwerp
		System.out.println („is 3 in de boom: “ + tree.lookForValue (3));
		System.out.println („is 4 in de boom: “ + tree.lookForValue (4));
		System.out.println („is 1 in de boom: “ + tree.lookForValue (1));
		System.out.println („is 10 in de boom: “ + tree.lookForValue (10));
		System.out.println („is 12 in de boom: “ + tree.lookForValue (12));
		System.out.println („is 13 in de boom: “ + tree.lookForValue (13));
		System.out.println („is 14 in de boom: “ + tree.lookForValue (14));
		System.out.println („is 16 in de boom: “ + tree.lookForValue (16));
		System.out.println („is 20 in de boom: “ + tree.lookForValue (20));
		System.out.println („is 21 in de boom: “ + tree.lookForValue (21));
		System.out.println („is 28 in de boom: “ + tree.lookForValue (28));
		System.out.println („is 29 in de boom: “ + tree.lookForValue (29));
		System.out.println („is 30 in de boom: “ + tree.lookForValue (30));
		System.out.println („is 39 in de boom: “ + tree.lookForValue (39));
	}
}

Antwoord : Logische Fouten van de Boom van Java de Binaire

Uw code zou behoorlijk werken als de boom na schrapping evenwichtig zou blijven. De belangrijkste oorzaak van uw probleem wordt verklaard hieronder:
Hier is de linkeronderverdeling nadat u de knoop met waarde 10 verwijdert.

                                            14
                                           /\
                                         3 12
                                        /\ \
                                      1 4 13

Als wij de knoop met waarde 12 willen vinden, volgens uw code worden 12 vergeleken met 14. Als zouden 12 <� 14="">om het probleem op te lossen u de boom evenwichtig moeten houden.
Andere oplossingen  
 
programming4us programming4us