insertElem
public void insertElem(int n){
root=addRec(root,n);
}
Вы переопределяете root
каждый раз, когда добавляете некоторые значения, поэтому при второй вставке вы забываете о его родительском элементе и т. Д., И в итоге вы знаете только о 80, так как это последний элемент, который вы вставляете, и последнее значение, которое вы переопределяете root
. root
следует инициализировать, только если это null
, например
if (root == null) root=addRec(root,n);
addRe c
public NodoT addRec(NodeT n, int elem){
if (n==null){
n=new NodeT(elem);
}
else{
if (elem<n.elem){
n.left=addRec(n.left,elem);
}
else{
n.right=addRec(n.right,elem);
}
}
return n;
}
Вы всегда устанавливаете n.left
или n.right
на значение, возвращаемое addRec
, который разрушает вашу структуру. Вы можете правильно позвонить addRec
, но ему следует присвоить n.left
или n.right
, только если соответствующее значение равно null
.
inorder
. наша текущая точка зрения.
search
выглядит хорошо.
delete
выглядит хорошо.
deleteNode
public NodeT deleteNode(NodeT curr, int n){
NodoT answ;
answ=search(curr,n);
if (answ==null){
System.out.println("not found");
return curr;
}
else{
if (curr.left==null)return curr.right;
else if (curr.right==null) return curr.left;
curr.elem=minValue(curr.right);
curr.right=deleteNode(curr.right,curr.elem);
}
return curr;
}
Вы не сравниваете фактические цифры. Идея должна состоять в том, что удаляемый элемент будет искать в правой ветви, если значение выше, чем значение текущего узла, и в левой ветви в противном случае. Если ветвь, в которой вам нужно искать, достигает null
, то элемент не существует в дереве. Смотрите реализацию Зейна Аршада. Я бы сделал нечто подобное, но так как он уже реализовал это, я обращаюсь к этому и поддерживаю это,