逻辑很简单 - 遍历根以后期顺序结束,然后使节点为空。下面是我为删除树的所有节点而编写的代码(即删除二叉树)。
问题:未删除实际树。我的意思是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;
}
}
答案 0 :(得分:5)
只需设置root=null;
C ++不是垃圾收集,而是Java。在Java中,一旦对象不再具有对它的任何引用,它将自动从内存中删除。如果垃圾收集对象的所有引用对象都没有其他引用,则它们也将被删除。该位解决了您的问题:如果root下的节点没有任何外部引用,它们将在root之后自动删除。
在deleteTree()
函数中,添加head=null;
//其他任何内容。
删除其他deleteTree(BTNode root)
函数,它没用。