CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

如何得到一般树(c++链表描述)的结点个数?

楼主alonejilin()2002-05-18 11:52:39 在 专题开发/技术/项目 / 数据结构与算法 提问

我的Tree定义如下:  
   
  template<class   T>class   Tree;  
  template<class   T>class   TreeNode{  
  friend   class   Tree<T>;  
  private:  
  T   data;  
  TreeNode<T>*   firstChild,*nextSibling;  
  public:  
  TreeNode(T   value,TreeNode<T>   *fc=NULL,TreeNode<T>   *ns=NULL):  
  data(value),firstChild(fc),nextSibling(ns){}  
  T   GetData(){return   data;}  
   
  };  
  template<class   T>   class   Tree{  
  public:  
  Tree():root(NULL),current(NULL){}  
  void   BuildRoot(T   rootVal);  
  int   Root();  
  long   Size(   TreeNode<T>*   &t);  
                                      TreeNode<T>*   GetRoot(){return   root;}  
  TreeNode<T>*   GetCurrent(){return   current;}  
  int   FirstChild();  
  int   NextSibling();  
  void   InsertChild(T   value);  
  void   RemovesubTree();  
  int   RemoveChild(int   i);  
  int   Parent();  
                                      int   Find(T   target);  
  TreeNode<T>*   Build(int   A[],int   n,int   i);  
                                      void   Build(int   A[],int   n,int   i,TreeNode<T>*   &ptr);  
  void   Search(T   &statr,T   &purpose,TreeNode<T>*   &ptr);  
  virtual   int   IsEmpty(){return   root==NULL?1:0;}  
  void   visit();  
                                      void   PreOrder();  
  void   PostOrder();  
  void   LevelOrder(int   DefaultSize);  
  private:  
  TreeNode<T>   *root,*current;  
  void   PreOrder(ostream&out,TreeNode<T>*p);  
  int   Find(TreeNode<T>*p,T   target);  
  void   RemovesubTree(TreeNode<T>*   p);  
  int   FindParent(TreeNode<T>*t,TreeNode<T>*p);  
  };  
  我写了一个Size函数:  
  可是我用每个结点有四个孩子的“完全四叉树”验证,但结果不对:  
  比如:  
  实际结点为   10个,但Size   为3个,  
  实际结点为   10个,但Size   为3个,  
  我百思不得其解:  
  template   <class   T>long   Tree<T>::Size(   TreeNode<T>*   &t)  
  {  
  if(t==NULL)return   0;  
  else{  
  TreeNode<T>*q,*q1;  
  q=q1=t->firstChild;  
  int   k=0,count=0;  
  while(q!=NULL){q=q->nextSibling;k++;}  
  if(q1!=NULL)  
    count=1+Size(q1);  
   
  for(int   i=2;i<=k;i++){  
                  count+=Size(q1->nextSibling);  
                  q1=q1->nextSibling;  
  }  
  return   count;  
  }  
  }  
  哪位大哥帮帮小弟?我出50分。  
  问题点数:50、回复次数:7Top

1 楼liulin(liulin)回复于 2002-05-18 15:18:47 得分 5

厉遍呗Top

2 楼bluegirl2003(小笨笨猫)回复于 2002-05-18 19:10:14 得分 0

how?Top

3 楼thinice(cursor)回复于 2002-05-18 19:56:09 得分 0

用递归,结点个数等于左右结点个数和再加1Top

4 楼alonejilin()回复于 2002-05-20 13:57:09 得分 0

这是一般树,每个结点不止是左右两个结点。Top

5 楼bjay(ben)回复于 2002-05-20 14:58:13 得分 45

广度优先遍历,(描述性算法,要用改造一下。)  
  其中用到的栈,自己构造一下吧。  
   
  int   i_count=0;  
  counting(TreeNode<T>   *T_cur)  
  {  
      TreeNode<T>   *T_temp;  
      if   (T_cur==null)   then   return();  
      i_count   ++;  
      push(firstchild());  
      while   ((T_temp   =nextchild())   !=NULL)  
          push   (T_temp);  
      T_temp   =pop();  
      counting(T_temp);  
  }  
   
  main()  
  {  
      TreeNode<T>   *T_temp;  
      T_temp   =GetRoot();  
      counting   (T_temp);  
  }Top

6 楼goodsong(风卷残云~不要把简单的事搞得N复杂)回复于 2002-05-20 19:02:27 得分 0

gzTop

7 楼sylmoon(专注Oracle)回复于 2002-05-21 20:34:49 得分 0

gzTop

相关问题

  • 一个数据结构关于链表结点添加的简单问题
  • a b c d 四个数组,
  • 在c/c++中,怎么样获得一个数据的个数?
  • xml中如何知道一个结点下的子结点个数?
  • 完全二叉树度数为1的结点的个数
  • 求助:建立单链表后,输入一个数据,如果此数据与单链表中的某几个结点中的数据相同,如何将这几个结点删除?
  • C++如何随机产生一个数
  • 各位大哥,请问怎么得到子结点的个数啊
  • C/C++如何返回一个数组/指针
  • 不能链接另一个数据库?

关键词

  • template
  • root
  • null
  • treenode
  • nextsibling
  • firstchild
  • tree
  • temp
  • counting
  • current

得分解答快速导航

  • 帖主:alonejilin
  • liulin
  • bjay

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo