高分求问:CopyTree函数是不是错了,为什么?应该怎么改?
自己写了一个二茶树结点的类,各个(成员)函数都没有问题,只是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




