10行代码!

古布 2004-05-05 10:57:51
typedef struct CSTree {
int data;
struct CSTree *firstchild, *nextsibling;
} *CSTree;

void DestroyTreeOne( CSTree& T ) // #1
{
if ( T ) {
if ( T->firstchild)
DestroyTree( T->firstchild);
if ( T->nextsibling)
DestroyTree( T->nextsibling);
delete T;
T = NULL;
}
}
void DestroyTreeTwo( CSTree& T ) // #2
{
if ( T ) {
if ( T->firstchild)
DestroyTree( T->firstchild);
if ( T->nextsibling)
DestroyTree( T->nextsibling);
delete T;
}
T = NULL;
}
#1和#2有什么区别?哪个有问题?为什么?谢谢!!
...全文
242 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
tudou614 2004-06-18
  • 打赏
  • 举报
回复
#2显然不对,应该在内部把占用的内存释放掉并把指针置为NULL
ancient 2004-06-13
  • 打赏
  • 举报
回复
个人认为一样,甚至除了根结点外没有那个T=NULL也不会产生错误,一个孩子-兄弟树的的析构过和可以完全等同于其对应二叉树的析构过程。
而且对除根以外的节点每个都重复的判断了两次是不是为NULL, "if ( T->firstchild)"和"if ( T->nextchild)"完全可以不要
jp1984 2004-06-11
  • 打赏
  • 举报
回复
好象是#1有问题 ,一般只有先删除子树节点后才删除跟节点啊 。 。
我觉得这肯定是中文教科书里面的例子,外面 用while 不是更好。
ljunfa 2004-06-11
  • 打赏
  • 举报
回复
前面两位,CSTree本身是指针,前面
Cyberweaver 2004-06-08
  • 打赏
  • 举报
回复
就是,CSTree &T ,
T既然是引用,干嘛还“T->firstchild”?
两个函数为什么delete后还赋NULL值呢?
主要是delete操作执行的是什么呢?
BinaryTreeEx 2004-06-08
  • 打赏
  • 举报
回复
既然是void DestroyTreeOne( CSTree& T )
就应该
if ( T.firstchild)
而不是
if ( T->firstchild)

iceheart 2004-06-08
  • 打赏
  • 举报
回复
看看生成的汇编代码吧,问题出在引用上面
kelodeafanso 2004-05-12
  • 打赏
  • 举报
回复
我看了一下,我觉得#1有点错,因为被delete掉的Node不是同一个父接点,Tree的遍历是重Tree
顶的两边开始的,在同一层递归中只=了一个NULL???
#2的一个对根接点=NULL,应该没什么问题.期待高手来做个令人信服的解释.

  • 打赏
  • 举报
回复
#2错误,#1正确,不过从你的打字来看,两个都有问题
popety_bit 2004-05-11
  • 打赏
  • 举报
回复
感觉#2还是有点错,你的程序应该是递归的吧,把所有的都递归完之后再依次另T=NULL,觉得不太妥,但我具体也说不清楚,期待高手来做个另人信服的解释.
古布 2004-05-10
  • 打赏
  • 举报
回复
#2 运行是出错
NowCan 2004-05-10
  • 打赏
  • 举报
回复
看不出来错在哪儿。
tudou614 2004-05-06
  • 打赏
  • 举报
回复
回复人: cqlhj() ( ) 信誉:100
回复人: firefoxes(火狐) ( ) 信誉:100

上面两位说的很好,结合两人的就是参考了!!!
nicememory 2004-05-06
  • 打赏
  • 举报
回复
typedef struct CSTree {
int data;
struct CSTree *firstchild, *nextsibling;
} *CSTree;

不知道这个你怎么通过编译的,标志符冲突了

下面两个函数我没看出什么区别,只是第个函数多做了一点点无用工作
firefoxes 2004-05-06
  • 打赏
  • 举报
回复
#1正确,#2有问题
因为#2左右孩子均被删除后并删除T,则此时T并不为空
fossil2000 2004-05-06
  • 打赏
  • 举报
回复
开始认为第二个错了,但后来细细想来,两个都好像都没有问题,
一般会认为第二个的T=NULL没有对每一个DELETE的结点执行,
DELETE后的结点,我认为这种执行没有什么必要,因为,给不给NULL,没有对下一次的执行判断产生影响,对每一个结点,所以,没有问题.

另:楼主的类型声明有问题,如像楼主这样写,编译器无法通过,可把后面一个*CSTree改个名字.
cqlhj 2004-05-06
  • 打赏
  • 举报
回复
#1正确,#2可能会有问题。
#2释放了内存后,但该指针并不为NULL。
nicememory 2004-05-06
  • 打赏
  • 举报
回复
你是运行出错?
还是这个是一道题目?
lvzi1331 2004-05-06
  • 打赏
  • 举报
回复
第二个错了
古布 2004-05-06
  • 打赏
  • 举报
回复
这个我敲错了。
typedef struct CSNode {
int data;
struct CSNode *firstchild, *nextsibling;
} *CSTree;
但#2后有T = NULL; 又怎么会错呢?不懂。
if ( T ) {
if ( T->firstchild)
DestroyTree( T->firstchild);
if ( T->nextsibling)
DestroyTree( T->nextsibling);
delete T;
}
T = NULL;
加载更多回复(1)

33,007

社区成员

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

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