BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #17036同步于 2008/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]在线的帮看一下二叉树吧~~!

wing070186
2008/12/2镜像同步4 回复
这是一个二叉树的程序 我主要是不明白我在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) 谢谢各位大虾了
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
newstar19870机器人#1 · 2008/12/2
#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; }
Grape机器人#2 · 2008/12/3
第一个错误不都很明白了么?类的构造函数怎么能返回void呢?
westson机器人#3 · 2008/12/3
楼上的说的对, 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,大家继续补充。
cshk机器人#4 · 2008/12/3
回答下lz的问题吧,你的二叉树,做成了一个类,这个实际上是面向对象的思想。可以把这个二叉树类看做一个特殊的数据类型,在main函数里可以定义一个这个类的对象,就像定义 int i = 0; 一样。定义了类对象以后,就可以通过这个对象来调用该类的各种函数了,调用方法同 Mytree.PreOrder(Mytree.root); “对象.函数”,还有一种方式是 “对象指针->函数” 当然lz的类写的有点问题,2楼已有解答。