数据结构与算法删除指定树的所有结点。感谢高手回答!!
时间:2011-08-10
来源:互联网
帮忙详细解释下:
template<class T>
void Tree<T>::DestroyNodes(TreeNode<T>*root)
{
//删除以root为根的子树的所有结点
if(root)
{
DestroyNodes(root->LeftMostChild()); //递归删除第一子树 LeftMostChild()函数返回第一个左子女
DestroyNodes(root->RightSibling()); //递归删除其他子树 RightSibling()函数返回右兄弟
delete root;
}
}
template<class T>
void Tree<T>::DeleteSubTree(TreeNode<T>*subroot)
{
//删除以subroot为根的子树的所有结点
TreeNode<T>*pointer=PrevSibling(subroot); //PrevSibling()返回当前结点的前一个邻居结点
if(pointer==NULL)
{
pointer=Parent(subroot); //返回当前结点的父节点
if(pointer)
{
pointer->pChild=subroot->RightSibling(); //pChild是左子节点是指针
subroot->pSibling=NULL; //pSibling是右兄弟节点是指针
}
else
{
root=subroot->RightSibling();
subroot->pSibling=NULL;
}
}
else
{
pointer->pSibling=subroot->RightSibling();
subroot->pSibling=NULL;
}
DestroyNodes(subroot);
}
能不能解释下递归过程,和第二个函数。最好有图。
面向21世纪课程教材 数据结构与算法 高等教育出版社 许卓群杨冬青 唐世渭 张铭 编写 第147页
template<class T>
void Tree<T>::DestroyNodes(TreeNode<T>*root)
{
//删除以root为根的子树的所有结点
if(root)
{
DestroyNodes(root->LeftMostChild()); //递归删除第一子树 LeftMostChild()函数返回第一个左子女
DestroyNodes(root->RightSibling()); //递归删除其他子树 RightSibling()函数返回右兄弟
delete root;
}
}
template<class T>
void Tree<T>::DeleteSubTree(TreeNode<T>*subroot)
{
//删除以subroot为根的子树的所有结点
TreeNode<T>*pointer=PrevSibling(subroot); //PrevSibling()返回当前结点的前一个邻居结点
if(pointer==NULL)
{
pointer=Parent(subroot); //返回当前结点的父节点
if(pointer)
{
pointer->pChild=subroot->RightSibling(); //pChild是左子节点是指针
subroot->pSibling=NULL; //pSibling是右兄弟节点是指针
}
else
{
root=subroot->RightSibling();
subroot->pSibling=NULL;
}
}
else
{
pointer->pSibling=subroot->RightSibling();
subroot->pSibling=NULL;
}
DestroyNodes(subroot);
}
能不能解释下递归过程,和第二个函数。最好有图。
面向21世纪课程教材 数据结构与算法 高等教育出版社 许卓群杨冬青 唐世渭 张铭 编写 第147页
作者: z5264 发布时间: 2011-08-10
对于第一个函数的递归过程,举个简单的例子:
小明的爷爷A有两个个孩子B和C,这两个孩子分别又有两个孩子,叫做D、E、F、G.
树的形状就可以表示如下:
C/C++ code
A就是根节点,调用DestroyNodes(A)的时候,首先把整个如果发现A节点存在,那么不管它有没有子节点都先做两件事,删除掉它的所有子节点,(因为这里使用的是二叉数,所以这里只有两个子节点)最后再删除它。
那么,就可以将A的子节点直到该分支的叶子节点看做一个整体,变为了M和N。
想要删除M和N该怎么做呢?
很明显,M和N仍然可看作一个独立的数,这样,想要删除它继续调用DestroyNodes(M)和DestroyNodes(N),即代码中的DestroyNodes(root->LeftMostChild());和DestroyNodes(root->RightSibling());
不过你的代码貌似是多子节点...所以简单了说可以注释为:
template<class T>
void Tree<T>::DestroyNodes(TreeNode<T>*root)
{
//删除以root为根的子树的所有结点
if(root)
{
DestroyNodes(root->LeftMostChild()); //向下查找,删除本节点的左边第一个子节点
DestroyNodes(root->RightSibling()); //平行查找,直到没有右兄弟为止
delete root;
}
}
自己画个图会很清楚的呵呵~发现我没讲到重点...悲剧!
小明的爷爷A有两个个孩子B和C,这两个孩子分别又有两个孩子,叫做D、E、F、G.
树的形状就可以表示如下:
C/C++ code
A A M N / \ === / \ + / \ + / \ B C M N D E F G / \ / \ D E F G
A就是根节点,调用DestroyNodes(A)的时候,首先把整个如果发现A节点存在,那么不管它有没有子节点都先做两件事,删除掉它的所有子节点,(因为这里使用的是二叉数,所以这里只有两个子节点)最后再删除它。
那么,就可以将A的子节点直到该分支的叶子节点看做一个整体,变为了M和N。
想要删除M和N该怎么做呢?
很明显,M和N仍然可看作一个独立的数,这样,想要删除它继续调用DestroyNodes(M)和DestroyNodes(N),即代码中的DestroyNodes(root->LeftMostChild());和DestroyNodes(root->RightSibling());
不过你的代码貌似是多子节点...所以简单了说可以注释为:
template<class T>
void Tree<T>::DestroyNodes(TreeNode<T>*root)
{
//删除以root为根的子树的所有结点
if(root)
{
DestroyNodes(root->LeftMostChild()); //向下查找,删除本节点的左边第一个子节点
DestroyNodes(root->RightSibling()); //平行查找,直到没有右兄弟为止
delete root;
}
}
自己画个图会很清楚的呵呵~发现我没讲到重点...悲剧!
作者: imitator 发布时间: 2011-08-10
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28