Question : Erreurs logiques d'arbre binaire de Java

J'inclus ici le code pour un arbre binaire. Il y a plusieurs problèmes avec le code. L'arbre est vide au début, puis des valeurs sont insérées. La première valeur sera au dessus. La prochaine valeur sera de la première aile gauche de valeurs si elle est plus petite puis la première valeur. Elle sera placée du côté droit si elle est plus grande puis la valeur initiale. Cette valeur sera le premier noeud d'enfant de valeurs, et la première valeur sera son parent. Quand une valeur a un noeud d'enfant gauche et bon, ces noeuds encore créeront de nouveaux noeuds d'enfant par la même logique quand de nouvelles valeurs sont insérées dans l'arbre. Dans cet example I emploiera les valeurs 1 3 4 10 12 13 14 15 16 20 21 28 29 30 39. Je supprimerai alors la valeur 10, et vois si je peux réarranger l'arbre correctement. L'arbre initial est censé ressembler à comme dans la figure A.

1) quand je supprime le noeud avec la valeur 10 je suivre la logique montrée dans la figure B. Tout semble fonctionner BIEN, et tous les nombres qui demeurent sont montrés, mais en recherchant toutes les valeurs, le mécanisme semble signaler que certains des nombres sont absents. Juste après la liste ils dans l'ordre. Exemple :

" l'arbre dans un affichage assorti : 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Is 3 dans l'arbre : true
Is 4 dans l'arbre : true
Is 1 dans l'arbre : true
Is 10 dans l'arbre : false
Is 12 dans l'arbre : false
Is 13 dans l'arbre : false
Is 14 dans l'arbre : true
Is 16 dans l'arbre : true
Is 20 dans l'arbre : true
Is 21 dans l'arbre : true
Is 28 dans l'arbre : true
Is 29 dans l'arbre : true
Is 30 dans l'arbre : true
Is 39 dans l'arbre : le "

This se produit seulement en supprimant 10 (noeud d'enfant d'aile gauche), mais non 28 (noeud d'enfant de côté droit). le

2) l'ordre des nombres semble obtenir jonglé autour après suppression. Je n'ai pas pu figurer dehors pourquoi. Après la suppression du noeud avec la valeur 10, j'obtiens cet ordre : 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Here vous pouvez voir que 14 est placés mal. Ceci ne se produit pas en supprimant le noeud avec la valeur 28.

Figure A : nom de fichier " " de >



Figure B le " le " de >


When le " le " de >
We en simulant la suppression de 28.
A) 29 prend 28's place.
B) que nous demandons au noeud à 29 pour trouver un nouvel espace pour 20.

Then nous simulons la suppression de 10.
I) 14 prend 10 place.
II) nous demandons à 14 pour trouver le nouvel espace pour la logique de 3.

The est les mêmes dans les deux exemples, seulement manipulant différents côtés d'un noeud donné (selon quel côté le noeud est sur celui est supprimé). class= > " clair " de
> de " codeSnippet " de class= de
class= " lineNumbers " de
class= de
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 :
sous-arbre " de " codeSnippet781788 d'id= " de
class de class= {
  rightTree = nulle privés de sous-arbre ;
  leftTree = nulle privés de sous-arbre ;
  parent = nulle privés de sous-arbre ;
  valeur privée d'international = 0 ;

  sous-arbre public (valeur d'international) {
    this.value = valeur ;
  }

  sous-arbre public (valeur d'international, parent de sous-arbre) {
    this.value = valeur ;
    this.parent = parent ;
  }

  insertValue vide de public (newValue d'international) {
    si (newValue de >= de valeur) {
      si (leftTree ! = nulle) {
        leftTree.insertValue (newValue) ;
      } autrement {
        leftTree = nouveau sous-arbre (newValue, ceci) ;
      }
    } autrement {
      si (rightTree ! = nulle) {
        rightTree.insertValue (newValue) ;
      } autrement {
        rightTree = nouveau sous-arbre (newValue, ceci) ;
      }
    }
  }

  corde publique toString () {
    Corde returString = "" ;
    si (leftTree ! = nulle) {
      returString = leftTree.toString () + « « ;
    }
    returString = returString + valeur ;
    si (rightTree ! = nulle) {
      returString = returString + « « + rightTree.toString () ;
    }
	showObject () ;
    returString de retour ;
  }

  lookForValue booléen public (søkeVerdi d'international) {
    si (valeur de == de søkeVerdi) {
      de retour rectifier ;
    }
    si (valeur > søkeVerdi) {
      si (leftTree ! = nulle) {
        leftTree.lookForValue de retour (søkeVerdi) ;
      } autrement {
        faux de retour ;
      }
    } autrement {
      si (rightTree ! = nulle) {
        rightTree.lookForValue de retour (søkeVerdi) ;
      } autrement {
        faux de retour ;
      }
    }
  }
  
  deleteValue booléen public (valeur d'international) {
    si (valeur de == de this.value) {
	//If nous avons trouvé le noeud avec la bonne valeur, nous devons trouver si elle a n'importe quels noeuds d'enfant
	  si (&& (de nulle de == de rightTree) (nulle de == de leftTree)) {
	    /** Ce noeud n'a aucun enfant, il peut être lié outre du tree.*/
		si (<= this.parent.getValue de valeur ()) {//We sont d'aile gauche, et nous reconnecterons là au parent
			this.parent.relink (0, nulle) ;
		} autrement {//We sont du côté droit, et nous reconnectons là au parent
			this.parent.relink (1, nulle) ;
		}
		//At l'extrémité nous reconnectons ce backreference d'objets pour parent :
		this.parent = nulle ;
		de retour rectifier ;
	  } autrement si ((&& (de nulle de == de rightTree) (leftTree ! = nulle)) || ((rightTree ! = && de nulle) (nulle de == de leftTree))) {
	    /** Le noeud a seulement un noeud d'enfant. Nous lions au-dessus de ce noeud à l'enfant *
		si (<= this.parent.getValue de valeur ()) {//We sont d'aile gauche, et nous lions là au-dessus de cet objet à ce rightTree d'objets
			si ((rightTree ! = && de nulle) (nulle de == de leftTree)) this.parent.relink (0, this.rightTree) ;
			si (&& (de nulle de == de rightTree) (leftTree ! = nulle)) this.parent.relink (0, this.leftTree) ;
			this.rightTree = nulle ;
		} autrement {//Or autrement nous sommes du côté droit, et nous lions là au-dessus de cet objet à ce leftTree d'objets
			si ((rightTree ! = && de nulle) (nulle de == de leftTree)) this.parent.relink (1, this.rightTree) ;
			si (&& (de nulle de == de rightTree) (leftTree ! = nulle)) this.parent.relink (1, this.leftTree) ;
			this.leftTree = nulle ;
		}
		//At l'extrémité nous reconnectons cette référence d'objets au parent :
		this.parent = nulle ;
		de retour rectifier ;
	  } autrement {
	    /** Le noden a deux noeuds d'enfant, ceux-ci doivent déplacé correctement et placé correctement sous le noeud de parent *
		si (<= this.parent.getValue de valeur ()) {//We sont de l'aile gauche, nous lient le bon noeud d'enfant de l'aile gauche au parent
			//We demandent alors au bon noeud d'enfant de trouver le nouvel espace pour le childnode gauche
			this.parent.relink (0, this.rightTree) ;
			this.rightTree.giveNewPlace (this.leftTree) ;
			this.rightTree = nulle ;
			this.leftTree = nulle ;
			this.parent = nulle ;
		} autrement {//Or autrement nous sommes du côté droit, et nous lions le bon noeud d'enfant du côté droit au parent
			this.parent.relink (1, this.rightTree) ;
			this.rightTree.giveNewPlace (this.leftTree) ;
			this.rightTree = nulle ;
			this.leftTree = nulle ;
			this.parent = nulle ;
		}
		this.parent = nulle ;
		de retour rectifier ;
	  }
	} autrement {
	//If nous n'avons pas le foumd le noeud avec la valeur correcte, nous rechercherons la note correcte d'enfant et regarderons là :
	  si (this.value < valeur) {
	    si (rightTree ! = nulle) rightTree.deleteValue (valeur) ;
	  } autrement {
	    si (leftTree ! = nulle) leftTree.deleteValue (valeur) ;
	  }
	}
    faux de retour ;
  }
  getValue public d'international () {
    this.value de retour ;
  }
  le vide de public reconnectent (international i, sous-arbre t) {
    si (I > 0) {
	  this.rightTree = t ;
	} autrement {
	  this.leftTree = t ;
	}
	t.setNewParent (ceci) ;
  }
  getChildNode public de sous-arbre (international i) {
    si (I > 0) {
	  this.rightTree de retour ;
	} autrement {
	  this.leftTree de retour ;
	}
  }
  giveNewPlace vide de public (sous-arbre t) {
	Sous-arbre t de //Takes et essais pour lui donner un nouvel endroit dans l'arbre
    //Check si ce noeud a l'espace pour un noeud d'enfant gauche, sinon :
    //Check si ce noeud a l'espace pour un bon noeud d'enfant et commande les deux childnodes corrects, sinon :
    //Ask le prochain childNode gauche pour donner le nouvel endroit avec son giveNewPlace ().
	si (nulle de == de this.leftTree) {
		this.leftTree = t ;
		t.setNewParent (ceci) ;
	} autrement si (nulle de == de this.rightTree) {
		si (getValue () < t.getValue ()) {
			this.rightTree = t ;
			t.setNewParent (ceci) ;
		} autrement {
			this.rightTree = this.leftTree ;
			this.leftTree = t ;
			t.setNewParent (ceci) ;
		}
	} autrement {
		this.leftTree.giveNewPlace (t) ;
	}
  }
  setNewParent vide de public (sous-arbre t) {
	this.parent = t ;
  }
  showObject vide de public () {
	System.out.println (« ----------------------------------------") ;
	si (parent ! = nulle) System.out.println (« parent :  » + parent.getValue ());
    System.out.println (« *Value :  » + this.value) ;
    si (rightTree ! = nulle) System.out.println (« enfant droit :  » + rightTree.getValue ());
    si (leftTree ! = nulle) System.out.println (« enfant laissé :  » + leftTree.getValue ());
	System.out.println (« ----------------------------------------") ;
  }
}

classe BinarySeekingTree {
  putréfaction privée de sous-arbre ;
  corde publique toString () {
    si (putréfaction ! = nulle) {
      rot.toString de retour () ;
    } autrement {
      nulle de retour ;
    }
  }

  insertValue vide de public (valeur d'international) {
    si (putréfaction ! = nulle) {
      rot.insertValue (valeur) ;
    } autrement {
      putréfaction = nouveau sous-arbre (valeur, nulle) ;
    }
  }
  
  deleteValue booléen public (valeur d'international) {
	//If là n'est aucune racine dans l'arbre, puis il n'y a aucune valeur à supprimer
    si (nulle de == de putréfaction) {
	  faux de retour ;
	} autrement {
	  si (rot.deleteValue (valeur)) {
	    de retour rectifier ;
	  } autrement {
	    faux de retour ;
	  }
	}
  }

  lookForValue booléen public (søkeVerdi d'international) {
    si (nulle de == de putréfaction) {
      faux de retour ;
    }
    rot.lookForValue de retour (søkeVerdi) ;
  }
}

recherche de classe {
	vide public de charge statique principal (args de corde []) {
		Arbre de BinarySeekingTree = nouveau 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'arbre dans un affichage assorti :  » + tree.toString ()); //Sorting échoue après la suppression d'un objet
		System.out.println (« est 3 dans l'arbre :  » + tree.lookForValue (3)) ;
		System.out.println (« est 4 dans l'arbre :  » + tree.lookForValue (4)) ;
		System.out.println (« est 1 dans l'arbre :  » + tree.lookForValue (1)) ;
		System.out.println (« est 10 dans l'arbre :  » + tree.lookForValue (10)) ;
		System.out.println (« est 12 dans l'arbre :  » + tree.lookForValue (12));
		System.out.println (« est 13 dans l'arbre :  » + tree.lookForValue (13));
		System.out.println (« est 14 dans l'arbre :  » + tree.lookForValue (14));
		System.out.println (« est 16 dans l'arbre :  » + tree.lookForValue (16));
		System.out.println (« est 20 dans l'arbre :  » + tree.lookForValue (20));
		System.out.println (« est 21 dans l'arbre :  » + tree.lookForValue (21));
		System.out.println (« est 28 dans l'arbre :  » + tree.lookForValue (28));
		System.out.println (« est 29 dans l'arbre :  » + tree.lookForValue (29));
		System.out.println (« est 30 dans l'arbre :  » + tree.lookForValue (30));
		System.out.println (« est 39 dans l'arbre :  » + tree.lookForValue (39));
		System.out.println (« nous essayons maintenant de supprimer la valeur 10 de l'arbre, mais non 28.") ;
		tree.deleteValue (10) ;
		//tree.deleteValue (28) ;
		System.out.println ("") ;
	System.out.println (« l'arbre dans un affichage assorti :  » + tree.toString ()); //Sorting échoue après la suppression d'un objet
		System.out.println (« est 3 dans l'arbre :  » + tree.lookForValue (3)) ;
		System.out.println (« est 4 dans l'arbre :  » + tree.lookForValue (4)) ;
		System.out.println (« est 1 dans l'arbre :  » + tree.lookForValue (1)) ;
		System.out.println (« est 10 dans l'arbre :  » + tree.lookForValue (10)) ;
		System.out.println (« est 12 dans l'arbre :  » + tree.lookForValue (12));
		System.out.println (« est 13 dans l'arbre :  » + tree.lookForValue (13));
		System.out.println (« est 14 dans l'arbre :  » + tree.lookForValue (14));
		System.out.println (« est 16 dans l'arbre :  » + tree.lookForValue (16));
		System.out.println (« est 20 dans l'arbre :  » + tree.lookForValue (20));
		System.out.println (« est 21 dans l'arbre :  » + tree.lookForValue (21));
		System.out.println (« est 28 dans l'arbre :  » + tree.lookForValue (28));
		System.out.println (« est 29 dans l'arbre :  » + tree.lookForValue (29));
		System.out.println (« est 30 dans l'arbre :  » + tree.lookForValue (30));
		System.out.println (« est 39 dans l'arbre :  » + tree.lookForValue (39));
	}
}
class= de

Réponse : Erreurs logiques d'arbre binaire de Java

Votre code fonctionnerait correctement si l'arbre resterait équilibré après suppression. La cause principale de votre problème est expliquée ci-dessous :
Voici le sous-arbre gauche après que vous enleviez le noeud avec la valeur 10.

                                            14
                                           /\
                                         3 12
                                        /\ \
                                      1 4 13

Si nous voulons trouver le noeud avec la valeur 12, selon votre code les 12 est comparés à 14. Si les 12 <� 14="">pour résoudre le problème vous maintiennent l'arbre équilibré.
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us