2012-02-25 3 views
1

Я пытаюсь написать метод isEmpty для двоичного дерева, но у меня проблема. Так что это метод, который я использую.Метод isEmpty для двоичного дерева proble

public boolean isEmpty(){ 
if(root == null) return true; 
else return false; 
} 

Когда я добавляю только один элемент, а затем удалить этот элемент, и вызвать IsEmpty, я не получаю верно, но неверно.

Есть ли что-то неправильно с моей реализацией?


Так что это способ удалить:

/** 
    * Internal method to remove from a subtree. 
    * @param x the item to remove. 
    * @param t the node that roots the tree. 
    * @return the new root. 
    * @throws ItemNotFoundException if x is not found. 
    */ 
    protected BinaryNode<AnyType> remove(AnyType x, BinaryNode<AnyType> t) 
    { 
    if(t == null) 
    throw new ItemNotFoundException(x.toString()); 
    if(x.compareTo(t.element) < 0) 
    t.left = remove(x, t.left); 
    else if(x.compareTo(t.element) > 0) 
    t.right = remove(x, t.right); 
    else if(t.left != null && t.right != null) // Two children 
    { 
    t.element = findMin(t.right).element; 
    t.right = removeMin(t.right); 
    } 
    else 
    t = (t.left != null) ? t.left : t.right; 
    return t; 
    } 

и это метод removeMin, который использует метод удалить:

 /** 
     * Internal method to remove minimum item from a subtree. 
     * @param t the node that roots the tree. 
     * @return the new root. 
     * @throws ItemNotFoundException if t is empty. 
     */ 
     protected BinaryNode<AnyType> removeMin(BinaryNode<AnyType> t) 
     { 
     if(t == null) 
     throw new ItemNotFoundException(); 
     else if(t.left != null) 
     { 
     t.left = removeMin(t.left); 
     return t; 
     } 
     else 
     return t.right; 
     } 
+1

Я думаю, проблема в функции удаления. Это выглядит нормально. – JProgrammer

+1

Метод 'isEmpty' является правильным. Было бы здорово, если бы вы показали нам метод 'remove'. –

+1

Это не причина вашей проблемы, но вы можете просто «вернуть root == null;» – Paul

ответ

0

Проверьте удалить код элемента. Обычно, чем код, выясните родительский узел удаления и установите нулевую ссылку. И для последнего элемента он должен установить значение root.

0

Ваш метод remove(AnyType x, BinaryNode<AnyType> t) выполняет поиск узла с элементом X и заменяет его одним из своих детей методом removeMin (в случае, если он имеет 2 детей) или с левым или правым дочерним узлом. Ваш общедоступный метод удаления может быть примерно таким:

public boolean remove(AnyType x) { 
    try { 
     BinaryNode<AnyType> node = remove(x, root); 
     if (node != null) { 
      node = null; 
      return true; 
     } 
     return fal 
    } catch (Exception e) { 
     //do something with the exception 
     return false; 
    } 
} 
+0

все еще не работает. когда я пытаюсь удалить элемент, введенный первым, значение isEmpty все равно false, что означает, что root еще не установлен в значение null. – FranXh

+0

вы сделали отладку и проверили, что корень и узел имеют одинаковое значение, когда ваше дерево имеет только 1 элемент? –