返回信息流这是一个二叉树的程序 我主要是不明白我在main函数里该怎么调用那些树里面的程序
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};
template<class T>
class BiTree
{
public:
BiTree(BiNode<T> *root);
void Creat(BiNode<T> *root);
void Release(BiNode<T> *root);
~BiTree();
void PreOrder(BiNode<T> *root);
void InOrder(BiNode<T> *root);
void PostOrder(BiNode<T> *root);
void LevelOrder(BiNode<T> *root);
int BiTreeDepth(BiNode<T> *root);
int NodeCount(BiNode<T> *root);
private:
BiNode<T> *root;
};
template<class T>
void BiTree<T>::BiTree(BiNode<T> *root)
{
Creat(root);
}
template<class T>
void BiTree<T>::Creat(BiNode<T> *root)
{
T ch;
cout<<"Please input yout data."<<endl;
cin>>ch;
if(ch=='#')root=NULL;
else{
root=new BiNode<T>;
root->data=ch;
Creat(root->lchild);
Creat(root->rchild);
}
}
template<class T>
void BiTree<T>::~BiTree(BiNode<T> *root)
{
Release(root);
}
template<class T>
void BiTree<T>::Release(BiNode<T> *root)
{
if(root!=NULL)
{
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
if(root==NULL) cout<<"This is unexisted";
else{
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
if(root==NULL) cout<<"This is unexisted";
else{
InOrder(root->lchild);
cout<<root->data;
InOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::PostOrder(BiNode<T> *root)
{
if(root==NULL) cout<<"This is unexisted";
else{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
}
template<class T>
void BiTree<T>::LevelOrder(BiNode<T> *root)
{//层序遍历
BTreeNode *q[30]; // 定义队列所使用的数组空间
int front=0 , rear=0; // 空队
BTreeNode *p;
if (root!=NULL)
{
rear=(rear+1)%30;
q[rear]=root; // 将树根结点进队
}
while(front!=rear) // 当队列非空时
{
front=(front+1)%30; // 从队列中删除结点指针之前 ,后移队首指针
p=q[front]; // 删除队首结点
cout<<p->data<<' '; // 输出队首结点的值
if(p->left!= NULL) // 若结点存在左孩子,则左孩子结点指针进队
{
rear=(rear+1)%30;
q[rear]=p->left;
}
if (p->right!=NULL)
{
rear=(rear+1)%30;
q[rear]=p->right;
}
}
}
template<class T>
int BiTree<T>::BiTreeDepth(BiNode<T> *root)
{
if (root==NULL)
return 0;
else
{
int dep1=BiTreeDepth(root->left);
int dep2=BiTreeDepth(root->right);
if (dep1>=dep2)
return dep1+1;
else
return dep2+1;
}
}
template<class T>
int BiTree<T>::NodeCount(BiNode<T> *root){//求二叉树的结点总数
if(root!=NULL) return 0;
else return NodeCount(root->lchild)+NodeCount(root->rchild)+1;
}
int main()
{
BiNode<char> *bt;
BiTree Mytree(bt);
cout<<"前序遍历结果为:"<<endl;
Mytree.PreOrder( Mytree.root);
return 0;
}
--------------------Configuration: 树 - Win32 Debug--------------------
Compiling...
树.cpp
E:\C++程序\树\树.cpp(33) : error C2533: 'BiTree<T>::BiTree<T>' : constructors not allowed a return type
E:\C++程序\树\树.cpp(34) : error C2954: template definitions cannot nest
E:\C++程序\树\树.cpp(52) : error C2631: 'BiTree<T>::~BiTree<T>' : destructors not allowed a return type
E:\C++程序\树\树.cpp(52) : error C2244: 'BiTree<T>::BiTree<T>::~BiTree<T>' : unable to resolve function overload
E:\C++程序\树\树.cpp(53) : error C2954: template definitions cannot nest
E:\C++程序\树\树.cpp(145) : error C2955: 'BiTree' : use of class template requires template argument list
E:\C++程序\树\树.cpp(28) : see declaration of 'BiTree'
E:\C++程序\树\树.cpp(145) : error C2514: 'BiTree' : class has no constructors
E:\C++程序\树\树.cpp(28) : see declaration of 'BiTree'
E:\C++程序\树\树.cpp(145) : error C2262: 'Mytree' : cannot be destroyed
执行 cl.exe 时出错.
树.obj - 1 error(s), 0 warning(s)
谢谢各位大虾了
这是一条镜像帖。来源:北邮人论坛 / cpp / #17036同步于 2008/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]在线的帮看一下二叉树吧~~!
wing070186
2008/12/2镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};
template<class T>
class BiTree
{
public:
BiTree();
BiNode<T> * Creat();
void Release(BiNode<T> *root);
~BiTree();
void PreOrder(BiNode<T> *root);
void InOrder(BiNode<T> *root);
void PostOrder(BiNode<T> *root);
void LevelOrder(BiNode<T> *root);
int BiTreeDepth(BiNode<T> *root);
int NodeCount(BiNode<T> *root);
BiNode<T> *root;
};
template<class T>
BiTree<T>::BiTree()
{
root=Creat();
}
template<class T>
BiNode<T>* BiTree<T>::Creat()
{
T ch;
cout<<"Please input yout data."<<endl;
cin>>ch;
BiNode<T>* r;
if(ch=='#')
r=NULL;
else{
r=new BiNode<T>;
r->data=ch;
r->lchild=Creat();
r->rchild=Creat();
}
return r;
}
template<class T>
BiTree<T>::~BiTree()
{
Release(root);
}
template<class T>
void BiTree<T>::Release(BiNode<T> *root)
{
if(root!=NULL)
{
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
if(root){
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
if(root){
InOrder(root->lchild);
cout<<root->data;
InOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::PostOrder(BiNode<T> *root)
{
if(root){
InOrder(root->lchild);
InOrder(root->rchild);
cout<<root->data;
}
}
template<class T>
void BiTree<T>::LevelOrder(BiNode<T> *root)
{//层序遍历
BiNode<T> *q[30]; // 定义队列所使用的数组空间
int front=0 , rear=0; // 空队
BiNode<T> *p;
if (root!=NULL)
{
rear=(rear+1)%30;
q[rear]=root; // 将树根结点进队
}
while(front!=rear) // 当队列非空时
{
front=(front+1)%30; // 从队列中删除结点指针之前 ,后移队首指针
p=q[front]; // 删除队首结点
cout<<p->data<<' '; // 输出队首结点的值
if(p->left!= NULL) // 若结点存在左孩子,则左孩子结点指针进队
{
rear=(rear+1)%30;
q[rear]=p->left;
}
if (p->right!=NULL)
{
rear=(rear+1)%30;
q[rear]=p->right;
}
}
}
template<class T>
int BiTree<T>::BiTreeDepth(BiNode<T> *root)
{
if (root==NULL)
return 0;
else
{
int dep1=BiTreeDepth(root->left);
int dep2=BiTreeDepth(root->right);
if (dep1>=dep2)
return dep1+1;
else
return dep2+1;
}
}
template<class T>
int BiTree<T>::NodeCount(BiNode<T> *root){//求二叉树的结点总数
if(root!=NULL)
return 0;
else
return NodeCount(root->lchild)+NodeCount(root->rchild)+1;
}
int main()
{
// BiNode<char> *bt;
BiTree<char> Mytree;
cout<<"前序遍历结果为:"<<endl;
Mytree.PreOrder(Mytree.root);
return 0;
}
楼上的说的对, constructors not allowed a return type。
destructors not allowed a return type。
Mytree.root---->cannot access private member declared in class 'BiTree。
VC6下还有 error C2954: template definitions cannot nest,大家继续补充。
回答下lz的问题吧,你的二叉树,做成了一个类,这个实际上是面向对象的思想。可以把这个二叉树类看做一个特殊的数据类型,在main函数里可以定义一个这个类的对象,就像定义 int i = 0; 一样。定义了类对象以后,就可以通过这个对象来调用该类的各种函数了,调用方法同 Mytree.PreOrder(Mytree.root); “对象.函数”,还有一种方式是 “对象指针->函数” 当然lz的类写的有点问题,2楼已有解答。