Cuestión : Errores lógicos del árbol binario de Java

Incluyo aquí el código para un árbol binario. Hay varios problemas con el código. El árbol es vacío al principio, después se insertan los valores. El primer valor estará en la tapa. El valor siguiente será en el lado izquierdo de los primeros valores si es más pequeño entonces el primer valor. Será colocado en el derecho si es más grande entonces el valor inicial. Este valor será el primer nodo de niño de los valores, y el primer valor será su padre. Cuando un valor tiene un nodo de niño izquierdo y correcto, esos nodos crearán otra vez nuevos nodos de niño por la misma lógica cuando los nuevos valores se insertan en el árbol. En este ejemplo 1 utilizará los valores 1 3 4 10 12 13 14 15 16 20 21 28 29 30 39. Entonces suprimiré el valor 10, y veo si puedo cambiar el árbol correctamente. El árbol inicial se supone para parecer como en la figura A.

1) cuando suprimo el nodo con el valor 10 yo seguir la lógica exhibida en la figura B. Todo parece trabajar MUY BIEN, y se exhiben todos los números que sigue habiendo, pero al buscar para todos los valores, el mecanismo parece divulgar que algunos de los números faltan. Enseguida después del listado ellos en orden. Ejemplo:

" el árbol en una exhibición clasificada: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Is 3 en el árbol: true
Is 4 en el árbol: true
Is 1 en el árbol: true
Is 10 en el árbol: false
Is 12 en el árbol: false
Is 13 en el árbol: false
Is 14 en el árbol: true
Is 16 en el árbol: true
Is 20 en el árbol: true
Is 21 en el árbol: true
Is 28 en el árbol: true
Is 29 en el árbol: true
Is 30 en el árbol: true
Is 39 en el árbol: el "

This sucede solamente al suprimir 10 (nodo de niño del lado izquierdo), solamente no 28 (nodo de niño del derecho). el

2) la orden de los números parece conseguir hecho juegos malabares alrededor después de la canceladura. No he podido imaginar por qué. Después de suprimir nodo con el valor 10, consigo esta orden: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Here usted puede ver que 14 está colocado mal. Esto no sucede al suprimir nodo con el valor 28.

Figure A: nombre de fichero " vacío " >

(21 KB) Javascript del href= " de los " attachmentDetails del class= " de (tipo de archivo detalles) anchura style= del >Figure A


Figure B del >
(27 KB) Javascript del href= " de los " attachmentDetails del class= " de (tipo de archivo detalles) anchura style= del >Figure B


When del >
We simulando la canceladura de 28.
A) 29 toma 28's place.
B) que pedimos nodo en 29 para encontrar un nuevo espacio para 20.

Then simulamos la canceladura de 10.
I) 14 tomamos 10 place.
II) pedimos 14 para encontrar el nuevo espacio para la lógica de 3.

The estamos iguales en ambos ejemplos, sólo manejan diversos lados de un nodo dado (dependiendo de qué lado es el nodo en ése se está suprimiendo). class= > " claro " 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:
sub-estructura notpretty de los >class " del class= " de " codeSnippet781788 del id= del
= del valor) {
      ¡si (leftTree! = falta de información) {
        leftTree.insertValue (newValue);
      } {
        leftTree = nueva sub-estructura (newValue, éste);
      }
    } {
      ¡si (rightTree! = falta de información) {
        rightTree.insertValue (newValue);
      } {
        rightTree = nueva sub-estructura (newValue, éste);
      }
    }
  }

  secuencia pública toString () {
    Secuencia returString = "";
    ¡si (leftTree! = falta de información) {
      el returString = leftTree.toString () + ““;
    }
    el returString = el returString + valor;
    ¡si (rightTree! = falta de información) {
      el returString = el returString + ““+ rightTree.toString ();
    }
	showObject ();
    el returString de vuelta;
  }

  lookForValue boleano público (søkeVerdi de la internacional) {
    si (valor del == del søkeVerdi) {
      de vuelta verdad;
    }
    si (valor > søkeVerdi) {
      ¡si (leftTree! = falta de información) {
        leftTree.lookForValue de vuelta (søkeVerdi);
      } {
        falso de vuelta;
      }
    } {
      ¡si (rightTree! = falta de información) {
        rightTree.lookForValue de vuelta (søkeVerdi);
      } {
        falso de vuelta;
      }
    }
  }
  
  deleteValue boleano público (valor de la internacional) {
    si (valor del == de this.value) {
	//If hemos encontrado nodo con valor correcto, nosotros tenemos que encontrar si tiene cualesquiera nodos de niño
	  si ((&& de la falta de información del == del rightTree) (falta de información del == del leftTree)) {
	    /** Este nodo no tiene ningún niño, él se puede ligar del tree.*/
		si (<= this.parent.getValue del valor ()) {//We está en lado izquierdo, y reconectaremos allí en el padre
			this.parent.relink (0, falta de información);
		} {//We está en el derecho, y reconectamos allí en el padre
			this.parent.relink (1, falta de información);
		}
		//At el extremo reconectamos este backreference de los objetos para parent:
		this.parent = falta de información;
		de vuelta verdad;
	  ¡} si (((&& de la falta de información del == del rightTree) (leftTree! = falta de información)) || ¡((rightTree! = && de la falta de información) (falta de información del == del leftTree))) {
	    /** El nodo tiene solamente un nodo de niño. Ligamos sobre este nodo al niño *
		si (<= this.parent.getValue del valor ()) {//We está en lado izquierdo, y ligamos allí sobre este objeto a este rightTree de los objetos
			¡si ((rightTree! = && de la falta de información) (falta de información del == del leftTree)) this.parent.relink (0, this.rightTree);
			¡si ((&& de la falta de información del == del rightTree) (leftTree! = falta de información)) this.parent.relink (0, this.leftTree);
			this.rightTree = falta de información;
		} {//Or estamos en el derecho, y ligamos allí sobre este objeto a este leftTree de los objetos
			¡si ((rightTree! = && de la falta de información) (falta de información del == del leftTree)) this.parent.relink (1, this.rightTree);
			¡si ((&& de la falta de información del == del rightTree) (leftTree! = falta de información)) this.parent.relink (1, this.leftTree);
			this.leftTree = falta de información;
		}
		//At el extremo reconectamos esta referencia de los objetos al padre:
		this.parent = falta de información;
		de vuelta verdad;
	  } {
	    /** El noden tiene dos nodos de niño, éstos tienen que movido correctamente y colocado correctamente bajo nodo del padre *
		si (<= this.parent.getValue del valor ()) {//We está en el lado izquierdo, nosotros liga nodo de niño correcto en lado izquierdo en el padre
			//We entonces pide que el nodo de niño correcto encuentre el nuevo espacio para el childnode izquierdo
			this.parent.relink (0, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = falta de información;
			this.leftTree = falta de información;
			this.parent = falta de información;
		} {//Or estamos en el derecho, y ligamos nodo de niño correcto en el derecho en el padre
			this.parent.relink (1, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = falta de información;
			this.leftTree = falta de información;
			this.parent = falta de información;
		}
		this.parent = falta de información;
		de vuelta verdad;
	  }
	} {
	//If no tenemos foumd el nodo con el valor correcto, buscaremos la nota correcta del niño y miraremos allí:
	  si (this.value < valor) {
	    ¡si (rightTree! = falta de información) rightTree.deleteValue (valor);
	  } {
	    ¡si (leftTree! = falta de información) leftTree.deleteValue (valor);
	  }
	}
    falso de vuelta;
  }
  getValue público de la internacional () {
    this.value de vuelta;
  }
  el vacío del público reconecta (internacional i, sub-estructura t) {
    si (i > 0) {
	  this.rightTree = t;
	} {
	  this.leftTree = t;
	}
	t.setNewParent (éste);
  }
  getChildNode público de la sub-estructura (internacional i) {
    si (i > 0) {
	  this.rightTree de vuelta;
	} {
	  this.leftTree de vuelta;
	}
  }
  giveNewPlace vacío del público (sub-estructura t) {
	Sub-estructura t de //Takes e intentos para darle un nuevo lugar en el árbol
    //Check si este nodo tiene espacio para un nodo de niño izquierdo, si no:
    //Check si este nodo tiene espacio para un nodo de niño correcto y pide los dos childnodes correctos, si no:
    //Ask el childNode izquierdo siguiente para dar el nuevo lugar con su giveNewPlace ().
	si (falta de información del == de this.leftTree) {
		this.leftTree = t;
		t.setNewParent (éste);
	} si (falta de información del == de this.rightTree) {
		si (getValue () < t.getValue ()) {
			this.rightTree = t;
			t.setNewParent (éste);
		} {
			this.rightTree = this.leftTree;
			this.leftTree = t;
			t.setNewParent (éste);
		}
	} {
		this.leftTree.giveNewPlace (t);
	}
  }
  setNewParent vacío del público (sub-estructura t) {
	this.parent = t;
  }
  showObject vacío del público () {
	System.out.println (“----------------------------------------");
	¡si (padre! = falta de información) System.out.println (“padre: ” + parent.getValue ());
    System.out.println (“*Value: ” + this.value);
    ¡si (rightTree! = falta de información) System.out.println (“niño adecuado: ” + rightTree.getValue ());
    ¡si (leftTree! = falta de información) System.out.println (“niño dejado: ” + leftTree.getValue ());
	System.out.println (“----------------------------------------");
  }
}

clase BinarySeekingTree {
  putrefacción privada de la sub-estructura;
  secuencia pública toString () {
    ¡si (putrefacción! = falta de información) {
      rot.toString de vuelta ();
    } {
      falta de información de vuelta;
    }
  }

  insertValue vacío del público (valor de la internacional) {
    ¡si (putrefacción! = falta de información) {
      rot.insertValue (valor);
    } {
      putrefacción = nueva sub-estructura (valor, falta de información);
    }
  }
  
  deleteValue boleano público (valor de la internacional) {
	//If allí no es ninguna raíz en el árbol, después no hay valor a suprimir
    si (falta de información del == de la putrefacción) {
	  falso de vuelta;
	} {
	  si (rot.deleteValue (valor)) {
	    de vuelta verdad;
	  } {
	    falso de vuelta;
	  }
	}
  }

  lookForValue boleano público (søkeVerdi de la internacional) {
    si (falta de información del == de la putrefacción) {
      falso de vuelta;
    }
    rot.lookForValue de vuelta (søkeVerdi);
  }
}

búsqueda de la clase {
	vacío público de los parásitos atmosféricos principal args (de la secuencia []) {
		Árbol de BinarySeekingTree = nuevo 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 (“el árbol en una exhibición clasificada: ” + tree.toString ()); //Sorting falla después de suprimir un objeto
		System.out.println (“es 3 en el árbol: ” + tree.lookForValue (3));
		System.out.println (“es 4 en el árbol: ” + tree.lookForValue (4));
		System.out.println (“es 1 en el árbol: ” + tree.lookForValue (1));
		System.out.println (“es 10 en el árbol: ” + tree.lookForValue (10));
		System.out.println (“es 12 en el árbol: ” + tree.lookForValue (12));
		System.out.println (“es 13 en el árbol: ” + tree.lookForValue (13));
		System.out.println (“es 14 en el árbol: ” + tree.lookForValue (14));
		System.out.println (“es 16 en el árbol: ” + tree.lookForValue (16));
		System.out.println (“es 20 en el árbol: ” + tree.lookForValue (20));
		System.out.println (“es 21 en el árbol: ” + tree.lookForValue (21));
		System.out.println (“es 28 en el árbol: ” + tree.lookForValue (28));
		System.out.println (“es 29 en el árbol: ” + tree.lookForValue (29));
		System.out.println (“es 30 en el árbol: ” + tree.lookForValue (30));
		System.out.println (“es 39 en el árbol: ” + tree.lookForValue (39));
		System.out.println (“ahora intentamos suprimir el valor 10 del árbol, pero no 28.");
		tree.deleteValue (10);
		//tree.deleteValue (28);
		System.out.println ("");
	System.out.println (“el árbol en una exhibición clasificada: ” + tree.toString ()); //Sorting falla después de suprimir un objeto
		System.out.println (“es 3 en el árbol: ” + tree.lookForValue (3));
		System.out.println (“es 4 en el árbol: ” + tree.lookForValue (4));
		System.out.println (“es 1 en el árbol: ” + tree.lookForValue (1));
		System.out.println (“es 10 en el árbol: ” + tree.lookForValue (10));
		System.out.println (“es 12 en el árbol: ” + tree.lookForValue (12));
		System.out.println (“es 13 en el árbol: ” + tree.lookForValue (13));
		System.out.println (“es 14 en el árbol: ” + tree.lookForValue (14));
		System.out.println (“es 16 en el árbol: ” + tree.lookForValue (16));
		System.out.println (“es 20 en el árbol: ” + tree.lookForValue (20));
		System.out.println (“es 21 en el árbol: ” + tree.lookForValue (21));
		System.out.println (“es 28 en el árbol: ” + tree.lookForValue (28));
		System.out.println (“es 29 en el árbol: ” + tree.lookForValue (29));
		System.out.println (“es 30 en el árbol: ” + tree.lookForValue (30));
		System.out.println (“es 39 en el árbol: ” + tree.lookForValue (39));
	}
}
class= del

Respuesta : Errores lógicos del árbol binario de Java

Su código trabajaría correctamente si el árbol seguiría siendo equilibrado después de la canceladura. La causa principal de su problema se explica abajo:
Aquí está la sub-estructura izquierda después de que usted quite el nodo con el valor 10.

                                            14
                                           /\
                                         3 12
                                        /\ \
                                      1 4 13

Si queremos encontrar el nodo con el valor 12, según su código los 12 se compara con 14. Si los 12 <� 14="">para solucionar el problema usted mantienen el árbol balanceado.
Otras soluciones  
 
programming4us programming4us