如何删除二叉树

时间:2015-03-17 16:59:32

标签: java data-structures binary-tree

逻辑很简单 - 遍历根以后期顺序结束,然后使节点为空。下面是我为删除树的所有节点而编写的代码(即删除二叉树)。

问题:未删除实际树。我的意思是deleteTree(BTNode root)函数只将null 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;
    }
}

1 个答案:

答案 0 :(得分:5)

只需设置root=null;

即可

C ++不是垃圾收集,而是Java。在Java中,一旦对象不再具有对它的任何引用,它将自动从内存中删除。如果垃圾收集对象的所有引用对象都没有其他引用,则它们也将被删除。该位解决了您的问题:如果root下的节点没有任何外部引用,它们将在root之后自动删除。

deleteTree()函数中,添加head=null; //其他任何内容。

删除其他deleteTree(BTNode root)函数,它没用。

相关问题