二叉树清空函数

firsthym 2009-09-22 02:55:30
SearchTree MakeEmpty(SearchTree T)
{
if(T!=NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}


请问这个递归函数到底是怎么进行的?
...全文
520 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHZiroy 2012-05-25
  • 打赏
  • 举报
回复
貌似这是销毁,不是清空
firsthym 2009-11-24
  • 打赏
  • 举报
回复
现在搞清楚了,该算法是一直递归到最左边的节点,调用free(T),然后层层向上左右free掉。
卡卡Gemini 2009-09-30
  • 打赏
  • 举报
回复
看了一会才看懂,是从树的顶端开始,分左右两个路径,递归调用函数,先找到子节点,然后清空当前结点,再把子节点作为一个新的当前结点。很巧妙,学习了
opposever 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 firsthym 的回复:]
我不明白free(T)是什么时候调用的?是在MakeEmpty(T->Right)调用之后的吗?
[/Quote]
每释放一个节点都会调用free(T),第一次调用是在左子树的最后一个节点,这时T->Left和T->Right都是NULL,所以MakeEmpty(T->Left),MakeEmpty(T->Right)直接返回,然后执行free(T)。
firsthym 2009-09-23
  • 打赏
  • 举报
回复
我不明白free(T)是什么时候调用的?是在MakeEmpty(T->Right)调用之后的吗?
ryfdizuo 2009-09-22
  • 打赏
  • 举报
回复
清空二叉树,只能后序遍历 清空!
zhouqiang312 2009-09-22
  • 打赏
  • 举报
回复
用到栈的知识,楼主好好看看
先清空左子数,再清除右子数,再清楚根节点!
关键是栈!
sunnywyg 2009-09-22
  • 打赏
  • 举报
回复
自己画一个栈,模拟一棵二叉树,使用栈的后进先出原则,透彻的分析一遍,以后你就都明白了
Smile_Tiger 2009-09-22
  • 打赏
  • 举报
回复
一般来说,递归函数都要处理两种状态。一种是递归中状态,一种是递归边缘状态。

大多数情况下,递归函数在处理递归中状态,但是递归是不能无限递归的(否则有可能是死循环了),它始终要到达边缘状态。

对于你的这个递归函数的代码,递归中状态是 (T != NULL),递归边缘状态是 (T == NULL)

可以看出,你的递归边缘状态什么事情也没做,就返回了
TianYiXiang 2009-09-22
  • 打赏
  • 举报
回复
说一个不是很形象的比喻:
先是根节点进栈,然后根节点的左子树进栈,然后根节点的左子树的左子树进栈.....
到...左子树为空,然后根节点的右子树进栈,然后根节点的右子树的右子树进栈.....
到...右子树为空.
然后出栈一个一个的节点释放!

菜鸟乱侃!
caolei_kunming 2009-09-22
  • 打赏
  • 举报
回复
是这样的,假设我们有一棵2叉树:
1.从根节点开始检查是否为空。
2.如果不为空的话,就先检查它的叶子节点,先左后右。
3.然后把自己给释放了。
这样一来,指针就到了它的左右叶子节点,再把左右节点看作根节点进行递归,直到叶子节点为空。
这样就可以销毁这棵二叉树了。
luyysea 2009-09-22
  • 打赏
  • 举报
回复
MakeEmpty返回的SearchTree类型变量应该是被销毁的节点中所包含的指向子节点的指针吧。这样层层深入,清空二叉树所有节点。
The_facE 2009-09-22
  • 打赏
  • 举报
回复
每个结点都是这么处理的,所以就会从最左边那个叶节点开始释放,每个都是左右中的顺序
The_facE 2009-09-22
  • 打赏
  • 举报
回复
字面就能看明白了,先清空左子树,再清空右子树,然后把自己干掉。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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