菜鸟一个关于清空二叉树的问题

zzhphp 2001-11-14 07:39:37
以下是我的代码(java),盼高手帮我找一下问题,
问题:为什么在我删除后,它还可以打印出来。
//数据结构
class TreeNode
{
public TreeNode left = null;
public TreeNode right = null;
public int data;

public TreeNode(int data)
{
this.data = data;
}

public TreeNode(int data,TreeNode left,TreeNode right)
{
this.data = data;
this.left = left;
this.right = right;
}
}
//实现二叉树功能的类
class treeMethord
{
int tem = 0;
int left = 0;
int right = 0;

public TreeNode deleteTree(TreeNode t)
{
if(t != null){
deleteTree(t.left);
deleteTree(t.right);
//freeTreeNode(t);
t = null;
}
return t;
}

public void printTree(TreeNode t, int level)
{
if(t != null){
printTree(t.right,level + 1);
indent(level);
System.out.println(t.data);
printTree(t.left,level + 1);
}
}

public void indent(int num)
{
String tem = " ";
for(int i = 0; i < num; i++)
System.out.print(tem);
}

public TreeNode getTreeNode(int data,TreeNode left,TreeNode right)
{
TreeNode t = new TreeNode(data,left,right);
return t;
}

public void freeTreeNode(TreeNode t)
{
t = null;
}

}
//运行的程序(文件名为:sort.java),所有类全在一个文件中
public class sort implements displayTree
{
public int[] sort = {12,4,54,94,99,23,34,22,67,02};

public static void main(String[] args)
{
treeMethord m = new treeMethord();
TreeNode t = m.getTreeNode(1,m.getTreeNode(2,m.getTreeNode(4,null,null),null),
//m.getTreeNode(3,null,m.getTreeNode(5,null,null)));
m.getTreeNode(3,null,null));

System.out.println("---------------------------");
System.out.println("output treeNode");
m.printTree(t,2);
System.out.println("---------------------------");
System.out.println("delete tree");
m.deleteTree(t);
//t = null;
m.printTree(t,5);

}
...全文
98 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtky_limi 2001-11-15
  • 打赏
  • 举报
回复
旁听
zzhphp 2001-11-15
  • 打赏
  • 举报
回复
谢谢! 给分
starfish 2001-11-14
  • 打赏
  • 举报
回复
你没有理解java中的对象,java中一个对象变量实际上是一个指向对象实例的指针,注意一下你的deleteTree函数,其形式是:
deleteTree(TreeNode t)
当你调用deleteTree(t)的时候,进入该函数的时候会产生一个临时变量t (这个t和调用函数时候的t不同,这是deleteTree的参数),这个变量会复制原来的变量,所以他也指向同一个对象实例,这时候你在deleteTree中令t = null,并没有释放该对象实例,参数t确实已经指向空了,但是调用函数时候的那个t并没有改变!!!!
由于java有自动的垃圾回收机制,你根本不用这么麻烦,只要 t = null就可以删除整棵树了(当然你要保证树的其他节点没有被任何局部变量所引用,但是却可以被父节点所引用)
注意,java的垃圾回收机制是,如果某个对象没有被任何全局变量或者局部变量所引用,则将其自动回收。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧