2015-03-17 7 views
1

Логика проста - пересечь корень, чтобы положить конец по порядку, а затем обнулить узлы. Ниже приведен код, который я написал для удаления всех узлов дерева (т. Е. Удаления двоичного дерева).Как удалить двоичное дерево

Проблема: фактическое дерево не удаляется. Я имею в виду, что функция deleteTree (корневой каталог BTNode) содержит только нулевые значения root ref, а не head.

tree.preorder(); 
    tree.deleteTree(); 
    tree.preorder();- this still prints all values of a tree 

Даже после выполнения tree.deleteTree() он печатает все узлы в дереве.

Может ли кто-нибудь помочь мне с тем, что ошибка в коде?

Примечание: нет ошибок в функциях вставки и предзаказа. Таким образом, вы можете просто сосредоточиться на deleteTree (код)

package com.practice; 

import java.util.LinkedList; 

public class BinaryTree { 
    private BTNode head; 

    public void insert(int data){ 
     BTNode n= new BTNode (data); 
     BTNode temp=null; 

     if(head==null){ 
      head=n; 
      return; 
     } 
     else{ 
      LinkedList q= new LinkedList(); 
      q.addLast(head); //enque 
      while(!q.isEmpty()){ 
        temp=(BTNode) q.removeFirst(); 
        if(temp.getLeft() ==null){ 

          temp.setLeft(n); 
          return; 
        } 
        else{ 
        //enque 
         q.addLast(temp.getLeft()); 
        } 

        if(temp.getRight() ==null){ 
         temp.setRight(n); 
         return; 
       } 
       else{ 
       //enque 
        q.addLast(temp.getRight()); 
       } 
      }//while loop ends here 
     } 
    }//insert ends here 

    public void preorder(){ 
     preorder(head); 
    } 

    private void preorder(BTNode head){ 
     if(head==null){ 
      return; 
     } 
     else{ 
      System.out.println(head.getData());\ 
       preorder(head.getLeft()); 

      preorder(head.getRight()); 
     } 
    } 

public void deleteTree(){ 
    deleteTreeInternal(this.head); 
} 

private void deleteTree(BTNode root){ 
    if(root == null){ 
     return ; 
    } 
    else{ 
     deleteTreeInternal(root.getLeft()); 
     deleteTreeInternal(root.getRight()); 

     root=null; 
    } 
} 
}//class ends here 
package com.practice; 

public class BTNode { 
    private BTNode left; 
    private BTNode right; 
    private int data; 

    public BTNode(){ 
    } 

    public BTNode(int data){ 
     this.data=data; 
     this.left=null; 
     this.right=null; 
    } 

    public BTNode getLeft() { 
     return left; 
    } 
    public void setLeft(BTNode left) { 
     this.left = left; 
    } 
    public BTNode getRight() { 
     return right; 
    } 
    public void setRight(BTNode right) { 
     this.right = right; 
    } 
    public int getData() { 
     return data; 
    } 
    public void setData(int data) { 
     this.data = data; 
    } 
} 

ответ

5

Просто установите root=null;

C++ не мусора, но Ява. В Java, когда объект больше не имеет ссылок на него, он будет автоматически удален из памяти. Все ссылочные объекты собранного мусора объекта также будут удалены, если у них нет других ссылок на них. Этот бит задает ваш вопрос: если узлы под root не имеют внешних ссылок, они будут автоматически удалены после root.

В вашей функции deleteTree(), положите head=null; // Ничего другого.

Удалить другую функцию deleteTree(BTNode root), ее использование бесполезно.

+0

Да, именно это я делаю, 'code'- deleteTreeInternal (root.getLeft()); deleteTreeInternal (root.getRight()); корень = null; deleteTree (корень BTNode) - удаляет все узлы корня один за другим. Но, когда я делаю preorder(), он работает. В идеале дерево должно быть удалено. –

+3

Вы устанавливаете значение параметра функции 'root'. Это не видно за пределами функции. Вам нужно установить * корень * вашего двоичного дерева, которое называется 'head'. – dhke

+0

см. Редактирование сделано @Naruto_Uzumaki, попробуйте это, он будет работать. –

Смежные вопросы