Вопрос : Ошибки бинарного дерева Java логически

Я вклюаю здесь Кодего для бинарного дерева. Будут несколько проблем с Кодим. Вал будет пустыми сперва, после этого значениями введен. Первое значение находится на верхней части. Следующее значение будет на стороне первых значений левой если оно более мало после этого первое значение. Оно будет помещен на правильной позиции если оно большле после этого первоначально значение. Этим значением будет первый узел ребенка значений, и первым значением будет свой родитель. Когда значение будет иметь и левый и правый узел ребенка, те узлы снова будут создавать новые узлы ребенка такой же логикой когда новые значения будут введены в вал. В этом примере я буду использовать значения 1 3 4 10 12 13 14 15 16 20 21 28 29 30 39. Я после этого уничтожу значение 10, и вижу если я могу переставить вал правильно. Первоначально вал предполагаем посмотреть как как в рисунок A.

1) когда я уничтожаю узел с значением 10 я последуйте за логикой показанной в рисунке B. Все кажется, что работает О'КЕЫ, и показаны все номера которые остают, но ища для всех значений, кажется, что сообщает механизм что некоторые из номеров пропавши. Сразу после перечисления они в заказе. Пример:

" вал в сортированной индикации: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Is 3 в вале: true
Is 4 в вале: true
Is 1 в вале: true
Is 10 в вале: false
Is 12 в вале: false
Is 13 в вале: false
Is 14 в вале: true
Is 16 в вале: true
Is 20 в вале: true
Is 21 в вале: true
Is 28 в вале: true
Is 29 в вале: true
Is 30 в вале: true
Is 39 в вале: поистине "

This случается только уничтожая 10 (узел ребенка левой стороны), только не 28 (узел ребенка правильной позиции). кажется, что получает

2) заказ номеров жонглированным вокруг после пропускания. Бедный человек, котор iий могут к давати в численном выражении почему. После уничтожать узел с значением 10, я получаю этот заказ: 1 3 4 14 12 13 15 16 20 21 28 29 30 39
Here вы можете увидеть что 14 помещены неправильно. Это не случается уничтожая узел с значением 28.

Figure a: filename " class= >

FigA.png (21 KB) яваскрипт " href= " " attachmentDetails class= (тип архива детали) ширина style= >


Figure b >
FigB.png (27 KB) яваскрипт " href= " " attachmentDetails class= (тип архива детали) ширина style= >


When >
We путем имитировать пропускание 28.
A) 29 принимает 28's place.
B), котор мы спрашиваем узел на 29 для того чтобы найти новый космос для 20.

Then мы имитируем пропускание 10.
I) 14 принимаем 10 place.
II) мы спрашиваем 14 для того чтобы найти новый космос для логики 3.

The этими же в обоих примерах, только регулирующ по-разному стороны, котор дали узла (в зависимости от что сторона узлом будет на том уничтожает). class= " ясное " >
> " codeSnippet " class=
class= " lineNumbers "
class=
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:
поддерево >class " class= " " codeSnippet781788 id=
= значения) {, то
      если (leftTree! = null) {
        leftTree.insertValue (newValue);
      } еще {
        leftTree = новое поддерево (newValue, это);
      }
    } еще {
      если (rightTree! = null) {
        rightTree.insertValue (newValue);
      } еще {
        rightTree = новое поддерево (newValue, это);
      }
    }
  }

  общественный шнур toString () {
    Шнур returString = "";
    если (leftTree! = null) {
      returString = leftTree.toString () + ««;
    }
    returString = returString + значение;
    если (rightTree! = null) {
      returString = returString + ««+ rightTree.toString ();
    }
	showObject ();
    возвращенный returString;
  }

  общественное булевское lookForValue (søkeVerdi int) {
    если (значение == søkeVerdi) {, то
      возвращенно true;
    }
    если (значение > søkeVerdi) {, то
      если (leftTree! = null) {
        возвращенное leftTree.lookForValue (søkeVerdi);
      } еще {
        возвращенное ложное;
      }
    } еще {
      если (rightTree! = null) {
        возвращенное rightTree.lookForValue (søkeVerdi);
      } еще {
        возвращенное ложное;
      }
    }
  }
  
  общественное булевское deleteValue (значение int) {
    если (значение == this.value) {, то
	//If мы находили узел с правым значением, мы должны найти если оно имеет любые узлы ребенка
	  если ((&&, то null == rightTree) (null == leftTree)) {
	    /** Этот узел не имеет никакого ребенка, его можно соединить с tree.*/
		если (<= this.parent.getValue, то значения ()) {//We находится на левой стороне, и мы relink там на родителе
			this.parent.relink (0, null);
		} еще {//We находится на правильной позиции, и мы relink там на родителе
			this.parent.relink (1, null);
		}
		//At конец мы relink это backreference предметов для того чтобы parent:
		this.parent = null;
		возвращенно true;
	  } еще если (, то ((&& null == rightTree) (leftTree! = null)) || ((rightTree! = && null) (null == leftTree))) {
	    /** Узел имеет только один узел ребенка. Мы соединяем над этим узлом к ребенку *
		если (<= this.parent.getValue, то значения ()) {//We находится на левой стороне, и мы соединяем там над этим предметом к этому rightTree предметов
			если (, то (rightTree! = && null) (null == leftTree)) this.parent.relink (0, this.rightTree);
			если ((&&, то null == rightTree) (leftTree! = null)) this.parent.relink (0, this.leftTree);
			this.rightTree = null;
		} еще {//Or еще мы находимся на правильной позиции, и мы соединяем там над этим предметом к этому leftTree предметов
			если (, то (rightTree! = && null) (null == leftTree)) this.parent.relink (1, this.rightTree);
			если ((&&, то null == rightTree) (leftTree! = null)) this.parent.relink (1, this.leftTree);
			this.leftTree = null;
		}
		//At конец мы relink эта справка предметов к родителю:
		this.parent = null;
		возвращенно true;
	  } еще {
	    /** Noden имеет 2 узла ребенка, эти после того как они двинуты правильно и после того как они установлены правильно под узлом родителя *
		если (<= this.parent.getValue, то значения ()) {//We находится на левой стороне, мы соединяет правый узел ребенка на левой стороне на родителе
			//We после этого спрашивает, что правый узел ребенка находит новый космос для левого childnode
			this.parent.relink (0, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = null;
			this.leftTree = null;
			this.parent = null;
		} еще {//Or еще мы находимся на правильной позиции, и мы соединяем правый узел ребенка на правильной позиции на родителе
			this.parent.relink (1, this.rightTree);
			this.rightTree.giveNewPlace (this.leftTree);
			this.rightTree = null;
			this.leftTree = null;
			this.parent = null;
		}
		this.parent = null;
		возвращенно true;
	  }
	} еще {
	//If мы foumd бедного человек узел с правильно значением, мы ищем правильно примечание ребенка и посмотрим там:
	  если (this.value < значение) {, то
	    если (rightTree! = null) rightTree.deleteValue (значение);
	  } еще {
	    если (leftTree! = null) leftTree.deleteValue (значение);
	  }
	}
    возвращенное ложное;
  }
  общественное getValue int () {
    возвращенное this.value;
  }
  свободное пространство публики relink (int iий, поддерево t) {
    если (I > 0) {, то
	  this.rightTree = t;
	} еще {
	  this.leftTree = t;
	}
	t.setNewParent (это);
  }
  общественное getChildNode поддерева (int iий) {
    если (I > 0) {, то
	  возвращенное this.rightTree;
	} еще {
	  возвращенное this.leftTree;
	}
  }
  giveNewPlace публики пустое (поддерево t) {
	Поддерево t //Takes и попытки для того чтобы дать ему новое место в вале
    //Check если этот узел имеет космос для левого узла, то ребенка, если не:, то
    //Check если этот узел имеет космос для правого узла ребенка и приказывает 2 childnodes правильно, то, если не:, то
    //Ask следующее левое childNode для того чтобы дать новое место с своим giveNewPlace ().
	если (null == this.leftTree) {, то
		this.leftTree = t;
		t.setNewParent (это);
	} еще если (null == this.rightTree) {, то
		если (getValue () < t.getValue, то ()) {
			this.rightTree = t;
			t.setNewParent (это);
		} еще {
			this.rightTree = this.leftTree;
			this.leftTree = t;
			t.setNewParent (это);
		}
	} еще {
		this.leftTree.giveNewPlace (t);
	}
  }
  setNewParent публики пустое (поддерево t) {
	this.parent = t;
  }
  showObject публики пустое () {
	System.out.println («----------------------------------------");
	если (родитель! = null) System.out.println («родитель: » + parent.getValue ());
    System.out.println («*Value: » + this.value);
    если (rightTree! = null) System.out.println («правый ребенок: » + rightTree.getValue ());
    если (leftTree! = null) System.out.println («ый ребенок: » + leftTree.getValue ());
	System.out.println («----------------------------------------");
  }
}

тип BinarySeekingTree {
  приватная ситовина поддерева;
  общественный шнур toString () {
    если (ситовина! = null) {
      возвращенное rot.toString ();
    } еще {
      возвращенный null;
    }
  }

  insertValue публики пустое (значение int) {
    если (ситовина! = null) {
      rot.insertValue (значение);
    } еще {
      ситовина = новое поддерево (значение, null);
    }
  }
  
  общественное булевское deleteValue (значение int) {
	//If там будет никаким корнем в вале, тогда не будет значения, котор нужно уничтожить
    если (null == ситовины) {, то
	  возвращенное ложное;
	} еще {
	  если (rot.deleteValue, то (значение)) {
	    возвращенно true;
	  } еще {
	    возвращенное ложное;
	  }
	}
  }

  общественное булевское lookForValue (søkeVerdi int) {
    если (null == ситовины) {, то
      возвращенное ложное;
    }
    возвращенное rot.lookForValue (søkeVerdi);
  }
}

искать типа {
	общественное свободное пространство static главным образом (args шнура []) {
		Вал BinarySeekingTree = новое 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 («вал в сортированной индикации: » + tree.toString ()); //Sorting терпит неудачу после уничтожать предмет
		System.out.println («3 в вале: » + tree.lookForValue (3));
		System.out.println («4 в вале: » + tree.lookForValue (4));
		System.out.println («1 в вале: » + tree.lookForValue (1));
		System.out.println («10 в вале: » + tree.lookForValue (10));
		System.out.println («12 в вале: » + tree.lookForValue (12));
		System.out.println («13 в вале: » + tree.lookForValue (13));
		System.out.println («14 в вале: » + tree.lookForValue (14));
		System.out.println («16 в вале: » + tree.lookForValue (16));
		System.out.println («20 в вале: » + tree.lookForValue (20));
		System.out.println («21 в вале: » + tree.lookForValue (21));
		System.out.println («28 в вале: » + tree.lookForValue (28));
		System.out.println («29 в вале: » + tree.lookForValue (29));
		System.out.println («30 в вале: » + tree.lookForValue (30));
		System.out.println («39 в вале: » + tree.lookForValue (39));
		System.out.println («мы теперь пытаемся уничтожить значение 10 от вала, но не 28.");
		tree.deleteValue (10);
		//tree.deleteValue (28);
		System.out.println ("");
	System.out.println («вал в сортированной индикации: » + tree.toString ()); //Sorting терпит неудачу после уничтожать предмет
		System.out.println («3 в вале: » + tree.lookForValue (3));
		System.out.println («4 в вале: » + tree.lookForValue (4));
		System.out.println («1 в вале: » + tree.lookForValue (1));
		System.out.println («10 в вале: » + tree.lookForValue (10));
		System.out.println («12 в вале: » + tree.lookForValue (12));
		System.out.println («13 в вале: » + tree.lookForValue (13));
		System.out.println («14 в вале: » + tree.lookForValue (14));
		System.out.println («16 в вале: » + tree.lookForValue (16));
		System.out.println («20 в вале: » + tree.lookForValue (20));
		System.out.println («21 в вале: » + tree.lookForValue (21));
		System.out.println («28 в вале: » + tree.lookForValue (28));
		System.out.println («29 в вале: » + tree.lookForValue (29));
		System.out.println («30 в вале: » + tree.lookForValue (30));
		System.out.println («39 в вале: » + tree.lookForValue (39));
	}
}
class=

Ответ : Ошибки бинарного дерева Java логически

Ваше Кодий работало бы правильн если вал остал бы сбалансированный после пропускания. Главная причина вашей проблемы объяснена ниже:
Здесь левое поддерево после того как вы извлекаете узел с значением 10.

                                            14
                                           /\
                                         3 12
                                        /\ \
                                      1 4 13

Если мы хотим найти узел с значением 12, то согласно вашему Кодему 12 сравнены с 14. Если 12 <� 14="">для того чтобы разрешить проблему вы должны держат вал сбалансированный.
Другие решения  
  •  Как я добавляю кнопки на форме PDF для того чтобы добавить/извлекаю рядки данных?
  •  Шнур ошибки в блоке задвижки?
  •  сколько вариант сервера SQL на одной машине
  •  Внешний вид 2007 не может архивный файл открытой сети сохраненный
  •  Активно директория DNS записывает вопрос
  •  Отчет о доступа 2010 экспорта к CSV с коллекторами?
  •  Прокладчик OCE 9400 не начинает
  •  как добавить десятичное место в формуле в отчете о кристалла seagate
  •  Windows XP и Мичрософт Оутлоок и проблемы установителя Windows
  •  VB6 к VS2010 - консультации тренировки?
  •  
    programming4us programming4us