Удаление листьев из бинарного дерева - PullRequest
1 голос
/ 20 октября 2011
public void deleteLeaves(BSTNode<T> p){                     //deletes leaves
    if(p.left != null){
      if(isLeaf(p.left))
        p.left = null;
    }
    else if(p.right != null){
      if(isLeaf(p.right))
        p.right = null;
    }
    else{
      deleteLeaves(p.right);
      deleteLeaves(p.left); 
    }
  }

Не могу понять, почему неправильно удаляются листья.Кажется, только удалить последний лист дерева.Буду очень признателен за любой совет, который поможет.

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Ваши операторы if немного испорчены;Будет взята только одна ветвей.Подумайте о том, что должно произойти, если соседский узел p.left или p.right равен нулю.

Если я правильно понимаю вашу структуру данных, я, вероятно, напишу ее так:

0 голосов
/ 20 октября 2011

Чтобы правильно использовать рекурсию, она должна быть в одном и том же виде управляющего оператора.Вы не должны проверять условие в if, а затем выполнять рекурсию в else if, or else.

0 голосов
/ 20 октября 2011

В данный момент, если p.left != null, то даже не будет проверяться p.right.else-if должно быть просто if.Кроме того, вы говорите, что если оба соседних узла имеют значение NULL, тогда вызывайте deleteLeaves() для них, что не имеет смысла, потому что они NULL.Перестройте свой код;У @aioobe есть хорошее предложение

...