CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

高分求问:CopyTree函数是不是错了,为什么?应该怎么改?

楼主fidelf(笨笨猪)2005-04-03 14:52:11 在 C/C++ / C++ 语言 提问

自己写了一个二茶树结点的类,各个(成员)函数都没有问题,只是CopyTree除外,哪位高手能指点一下,小弟不胜感激。见注释,谢谢  
  #include   <iostream>  
   
  using   namespace   std;  
   
  const   int   IndentBlock=6;  
  //节点类  
  class   TreeNode_T  
  {  
  private:  
  TreeNode_T   *_pLeft;  
  TreeNode_T   *_pRight;  
  public:  
  int   _data;  
  TreeNode_T(void);  
  TreeNode_T(const   int&   data,   TreeNode_T   *pLeft=NULL,   TreeNode_T   *pRight=NULL);  
  TreeNode_T*   GetLeftNode(void)   const;//取左节点  
  TreeNode_T*   GetRightNode(void)   const;//取右节点  
  };  
   
  TreeNode_T::TreeNode_T(void)  
  {  
  _data=0;  
  _pLeft=NULL;  
  _pRight=NULL;  
  }  
   
  TreeNode_T::TreeNode_T(const   int&   data,   TreeNode_T   *pLeft,   TreeNode_T   *pRight)  
  {  
  _data=data;  
  _pLeft=pLeft;  
  _pRight=pRight;  
  }  
   
  TreeNode_T*   TreeNode_T::GetLeftNode(void)   const  
  {  
  return   _pLeft;  
  }  
   
  TreeNode_T*   TreeNode_T::GetRightNode(void)   const  
  {  
  return   _pRight;  
  }  
   
  //取得一个新的节点  
  TreeNode_T*   GetTreeNode(const   int&   data,   TreeNode_T   *pLeft=NULL,   TreeNode_T   *pRight=NULL)  
  {  
  TreeNode_T   *pNewNode;  
  pNewNode=NULL;  
   
  pNewNode=new   TreeNode_T(data,   pLeft,   pRight);  
   
  if(pNewNode==NULL)  
  {  
  cerr<<"Memory   allocation   failure!"<<endl;  
  exit(1);  
  }  
   
  return   pNewNode;  
  }  
   
  //释放一个节点  
  void   FreeTreeNode(TreeNode_T   *pTreeNode)  
  {  
  delete   pTreeNode;  
  }  
   
  //前序遍历  
  void   PreOrder(TreeNode_T   *pRoot)  
  {  
  if(pRoot!=NULL)  
  {  
  cout<<pRoot->_data<<"   ";  
  PreOrder(pRoot->GetLeftNode());  
  PreOrder(pRoot->GetRightNode());  
  }  
  }  
   
  //中序遍历  
  void   InOrder(TreeNode_T   *pRoot)  
  {  
  if(pRoot!=NULL)  
  {  
  InOrder(pRoot->GetLeftNode());  
  cout<<pRoot->_data<<"   ";  
  InOrder(pRoot->GetRightNode());  
  }  
  }  
   
  //后序遍历  
  void   PostOrder(TreeNode_T   *pRoot)  
  {  
  if(pRoot!=NULL)  
  {  
  PostOrder(pRoot->GetLeftNode());  
  PostOrder(pRoot->GetRightNode());  
  cout<<pRoot->_data<<"   ";  
  }  
  }  
   
  //计算叶子数目  
  int   CountLeaf(TreeNode_T   *pRoot,   int&   count)  
  {  
  if(pRoot!=NULL)  
  {  
  CountLeaf(pRoot->GetLeftNode(),   count);  
  CountLeaf(pRoot->GetRightNode(),   count);  
   
  if(pRoot->GetLeftNode()==NULL&&pRoot->GetRightNode()==NULL)  
  count++;  
  }  
  return   count;  
  }  
   
  //计算树的深度  
  int   Depth(TreeNode_T   *pRoot)  
  {  
  int   depth,   depthLeft,   depthRight;  
  if(pRoot==NULL)  
  depth=-1;  
  else  
  {  
  depthLeft=Depth(pRoot->GetLeftNode());  
  depthRight=Depth(pRoot->GetRightNode());  
  depth=1+(depthLeft>depthRight?depthLeft:depthRight);  
  }  
  return   depth;  
  }  
  //以下两个函数是水平打印树  
  void   IndentBlanks(int   num)  
  {  
  for(int   i=0;i<num;i++)  
  cout<<"   ";  
  }  
   
  void   PrintTree(TreeNode_T   *pRoot,   int   level)  
  {  
  if(pRoot!=NULL)  
  {  
  PrintTree(pRoot->GetRightNode(),   level+1);  
  IndentBlanks(IndentBlock*level);  
  cout<<pRoot->_data<<endl;  
  PrintTree(pRoot->GetLeftNode(),   level+1);  
  }  
  }  
   
  //复制树,这个函数有问题,我不知道为什么,也不知道怎么改?  
  TreeNode_T*   CopyTree(TreeNode_T   *pRoot)  
  {  
  TreeNode_T   *pLeft,   *pRight,   *pNew;  
   
  if(pRoot==NULL)  
  return   NULL;  
   
  if(pRoot->GetLeftNode()!=NULL)  
  CopyTree(pRoot->GetLeftNode());  
  else  
  pLeft=NULL;  
   
  if(pRoot->GetRightNode()!=NULL)  
  CopyTree(pRoot->GetRightNode());  
  else  
  pRight=NULL;  
   
  pNew=GetTreeNode(pRoot->_data,   pLeft,   pRight);  
   
  return   pNew;  
  }  
   
  void   DeleteTree(TreeNode_T   *pRoot)  
  {  
  if(pRoot!=NULL)  
  {  
  DeleteTree(pRoot->GetLeftNode());  
  DeleteTree(pRoot->GetRightNode());  
  FreeTreeNode(pRoot);  
  }  
  }  
   
  void   ClearTree(TreeNode_T   *&pRoot)  
  {  
  DeleteTree(pRoot);  
  pRoot=NULL;  
  }  
   
  void   main(void)  
  {  
  TreeNode_T   *a,   *b,   *c,   *d,   *e,   *root1;  
  a=NULL;  
  b=NULL;  
  c=NULL;  
  d=NULL;  
  root1=NULL;  
                   
                                                    //一次创建节点,并组成一棵树;  
  d=GetTreeNode(40);  
  e=GetTreeNode(50);  
  b=GetTreeNode(20,   NULL,   d);  
  c=GetTreeNode(30,   e,   NULL);  
  a=GetTreeNode(10,   b,   c);  
  root1=a;  
   
  TreeNode_T   *root2;  
  root2=NULL;  
   
  PrintTree(root1,0);  
  cout<<endl;  
   
  PreOrder(root1);  
  cout<<endl;  
   
  InOrder(root1);  
  cout<<endl;  
   
  PostOrder(root1);  
  cout<<endl;  
   
  int   count,   depth;  
  count=0;  
  depth=Depth(root1);  
  count=CountLeaf(root1,   count);  
  cout<<"The   depth   of   the   tree   is:   "<<depth<<endl;  
  cout<<"There   are   "<<count<<"   leaves   in   the   tree"<<endl;  
   
  root2=CopyTree(root1);//复制root1到root2,有错误  
   
  PrintTree(root2,0);  
  PreOrder(root2);  
  cout<<endl;  
  cout<<"The   depth   of   the   tree   is:   "<<Depth(root2)<<endl;  
   
  ClearTree(root1);  
  ClearTree(root2);  
  }  
  问题点数:50、回复次数:7Top

1 楼yemin2004(peter_ye)回复于 2005-04-03 15:21:01 得分 0

TreeNode_T*   CopyTree(TreeNode_T   *pRoot)  
  {  
  TreeNode_T   *pLeft,   *pRight,   *pNew;  
   
                    pNewNode=new   TreeNode_T(data,   pLeft,   pRight);  
  if(pNew==null)  
  {  
  cout<<"memory   full!"<<endl;  
  exit(0);  
  }  
                    pNew=GetTreeNode(pRoot->_data,   pLeft,   pRight);  
   
  if(pRoot==NULL)  
  return   NULL;  
   
  if(pRoot->GetLeftNode()!=NULL)  
  CopyTree(pRoot->GetLeftNode());  
  else  
  pLeft=NULL;  
   
  if(pRoot->GetRightNode()!=NULL)  
  CopyTree(pRoot->GetRightNode());  
  else  
  pRight=NULL;  
   
  return   pNew;  
  }  
  Top

2 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-03 15:44:08 得分 0

markTop

3 楼longlijun(风之力)回复于 2005-04-03 18:58:03 得分 50

TreeNode_T*   CopyTree(TreeNode_T   *pRoot)  
  {  
  TreeNode_T   *pLeft,   *pRight,   *pNew;  
   
  pLeft   =   pRight   =   NULL;  
  if(pRoot==NULL)  
  return   NULL;  
   
  if(pRoot->GetLeftNode()!=NULL)  
  {  
  pLeft   =   CopyTree(pRoot->GetLeftNode());  
  }  
   
  if(pRoot->GetRightNode()!=NULL)  
  {  
  pRight   =   CopyTree(pRoot->GetRightNode());  
  }  
   
  pNew=GetTreeNode(pRoot->_data,   pLeft,   pRight);  
   
  return   pNew;  
  }Top

4 楼fidelf(笨笨猪)回复于 2005-04-04 10:06:02 得分 0

楼上二位改的都不对啊,还是不能把root1拷贝到root2,郁闷Top

5 楼longlijun(风之力)回复于 2005-04-04 15:55:17 得分 0

你的程序,我是改了后运行过,  
  并且 PrintTree(root2,0);  
  PreOrder(root2);  
  都有正确的输出  
  为什么你说不对,  
   
  你运行了没有Top

6 楼hywhy(满满)回复于 2005-04-04 16:05:35 得分 0

大哥,哈哈哈哈,你真是强啊Top

7 楼fidelf(笨笨猪)回复于 2005-04-09 16:18:57 得分 0

to:longlijun(风之力):  
  不好意思,这位兄弟,你的是正确的,谢谢了Top

相关问题

  • 分页函数
  • 散分!!纯虚函数与虚函数??
  • 编程高手指教:什么时候应该用到fflush()函数?(50分)
  • 150分!需两个函数!
  • WNetGetResourceParent 函数用法 100分!!!!!
  • 分组函数的使用
  • 50分,求一函数!!!!!!!!!!!
  • 变量分配函数
  • 分词(提词)函数?
  • 分析函数的疑问

关键词

  • 节点
  • null
  • treenode
  • pright
  • pleft
  • pnewnode
  • const
  • data

得分解答快速导航

  • 帖主:fidelf
  • longlijun

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

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