+ -
当前位置:首页 → 问答吧 → 数据结构与算法删除指定树的所有结点。感谢高手回答!!

数据结构与算法删除指定树的所有结点。感谢高手回答!!

时间: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页

作者: z5264   发布时间: 2011-08-10

对于第一个函数的递归过程,举个简单的例子:
小明的爷爷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