,二叉树问题 高手帮忙解决下
初学模板,二叉树问题..请高手帮忙解决下。..#include<iostream>usingnamespacestd;template<classT>structBiNo...
初学模板,二叉树问题..请高手帮忙解决下。..
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode * lchild,* rchild;
};
class BiTree
{
public:
BiTree(){root=NULL;}
// ~BiTree();
void PreOrder();
void InOrder();
void PostOrder();
void LevelOrder();
template<class T>
void Creat(BiNode<T>* root)
{
int ch;
cin>>ch;
if(ch == '#')
{
root = NULL;
}
else
{
root=new BiNode<T>;
root->data=ch;
Creat(root->lchild);
Creat(root->rchild);
}
}
template<class T>
T PreOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
T InOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
InOrder(root->lchild);
return root->data;
InOrder(root->rchild);
return root->data;
}
}
template<class T>
T PostOrder(BiNode<T>* root)
{
if(root==NULL)return;
{
PostOrder(root->lchild);
PostOrder(root->rchild);
return root->data;
}
}
template<class T>
T LevelOrder(BiNode<T>* root)
{
int front=0,rear=0;
BiNode* q;
int Q[100];
if(root==NULL)return;
Q[++rear]=root->data;
while(front!=rear)
{
q->data=Q[++front];
cout<<q->data;
if(q->lchild!=NULL)Q[++rear]=q->lchild->data;
if(q->rchild!=NULL)Q[++rear]=q->rchild->data;
}
}
template<class T>
void Release(BiNode<T>* root)
{
if(root!=NULL)
Release(root->lchild);
Release(root->rchild);
delete root;
}
//~BiTree()
//{
// Release(root);
//}//
private:
template<class T>
BiNode<T>* root;
void Creat();
void Release();
};
main()
{
BiTree<int>* obj1;
int ch;
int i,a,b=0;
int root1;
cout<<"输入二叉树";
obj1.Creat(root1);
while(b=1)
{
cout<<"\t********** select ************\n" ;
cout<<"\t1:前序遍历 " ;
cout<<"\t2:中序遍历\n";
cout<<"\t3: 后序遍历\n" ;
cout<<"\t4: 层序遍历\n" ;
cout<<"\t0: 退出\n" ;
cout<<"\t******************************\n" ;
cout<<"请选择:";
cin>>i;
switch(i)
{
case 1:
obj1.PreOrder(root1);
break;
case 2:
obj1.InOrder(root1);
break;
case 3:
obj1.PostOrder(root1);
break;
case 4:
obj1.LevelOrder(root1);
break;
case 5:
b=0;
break;
}
return 0;
}
}
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(139) : error C2143: syntax error : missing ';' before '<'
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(139) : error C2143: syntax error : missing ';' before '<'
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(144) : error C2065: 'obj1' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(144) : error C2228: left of '.Creat' must have class/struct/union type
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(163) : error C2228: left of '.PreOrder' must have class/struct/union type
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(167) : error C2228: left of '.InOrder' must have class/struct/union type 展开
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode * lchild,* rchild;
};
class BiTree
{
public:
BiTree(){root=NULL;}
// ~BiTree();
void PreOrder();
void InOrder();
void PostOrder();
void LevelOrder();
template<class T>
void Creat(BiNode<T>* root)
{
int ch;
cin>>ch;
if(ch == '#')
{
root = NULL;
}
else
{
root=new BiNode<T>;
root->data=ch;
Creat(root->lchild);
Creat(root->rchild);
}
}
template<class T>
T PreOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
T InOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
InOrder(root->lchild);
return root->data;
InOrder(root->rchild);
return root->data;
}
}
template<class T>
T PostOrder(BiNode<T>* root)
{
if(root==NULL)return;
{
PostOrder(root->lchild);
PostOrder(root->rchild);
return root->data;
}
}
template<class T>
T LevelOrder(BiNode<T>* root)
{
int front=0,rear=0;
BiNode* q;
int Q[100];
if(root==NULL)return;
Q[++rear]=root->data;
while(front!=rear)
{
q->data=Q[++front];
cout<<q->data;
if(q->lchild!=NULL)Q[++rear]=q->lchild->data;
if(q->rchild!=NULL)Q[++rear]=q->rchild->data;
}
}
template<class T>
void Release(BiNode<T>* root)
{
if(root!=NULL)
Release(root->lchild);
Release(root->rchild);
delete root;
}
//~BiTree()
//{
// Release(root);
//}//
private:
template<class T>
BiNode<T>* root;
void Creat();
void Release();
};
main()
{
BiTree<int>* obj1;
int ch;
int i,a,b=0;
int root1;
cout<<"输入二叉树";
obj1.Creat(root1);
while(b=1)
{
cout<<"\t********** select ************\n" ;
cout<<"\t1:前序遍历 " ;
cout<<"\t2:中序遍历\n";
cout<<"\t3: 后序遍历\n" ;
cout<<"\t4: 层序遍历\n" ;
cout<<"\t0: 退出\n" ;
cout<<"\t******************************\n" ;
cout<<"请选择:";
cin>>i;
switch(i)
{
case 1:
obj1.PreOrder(root1);
break;
case 2:
obj1.InOrder(root1);
break;
case 3:
obj1.PostOrder(root1);
break;
case 4:
obj1.LevelOrder(root1);
break;
case 5:
b=0;
break;
}
return 0;
}
}
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(139) : error C2143: syntax error : missing ';' before '<'
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(139) : error C2143: syntax error : missing ';' before '<'
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(144) : error C2065: 'obj1' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(144) : error C2228: left of '.Creat' must have class/struct/union type
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(163) : error C2228: left of '.PreOrder' must have class/struct/union type
C:\Program Files\Microsoft Visual Studio\MyProjects\2323\11.cpp(167) : error C2228: left of '.InOrder' must have class/struct/union type 展开
1个回答
展开全部
- -bnr...........
首先,我本想帮你仔细的把所有错误改完,形成一个正确的二叉树模板代码。
但是,我发现除了十几个模板类声明错误以外,还发现一些函数调用的错误(比如需要返回值的函数你返回了空)。
所以我估计,你这些代码要重写。
大体逻辑是对的,只是过多的细节和结构有问题。你应该好好复习一下关于模板类、模板函数。
为了不使原有的知识和模板知识混淆,且目标是构造二叉树,你先不用模板类,直接为int,接着再把int全改成模板T类型。
另外,我只能把错误给你指出来,但是由于你这个程序整体结构设计有点问题,所以不能基于你已有的代码改成完全正确的。
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode * lchild,* rchild;
}; /* 这个没问题 */
/* 这个有大问题 ,template<typename T>应该加在类前面 */
class BiTree
{
public:
BiTree(){root=NULL;}
// ~BiTree();
void PreOrder();
void InOrder();
void PostOrder();
void LevelOrder();
/* 这下面的每一个template<class T>都可以去掉 由于整个类已经是模板化了 */
template<class T>
void Creat(BiNode<T>* root)
{
int ch;
cin>>ch;/* 为了保证结构与使用分离,所有二叉树操作函数都不应该涉及到用户直接输入的东西 */
if(ch == '#')
{
root = NULL;
}
else
{
root=new BiNode<T>;
root->data=ch;
Creat(root->lchild);
Creat(root->rchild);
}
}
template<class T>
T PreOrder(BiNode<T>* root)
{
if(root==NULL)return;/* T类型的函数是不能返回void的,后面也出现了同样的问题 */
else
{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
T InOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
InOrder(root->lchild);
return root->data;
InOrder(root->rchild);
return root->data;
}
}
template<class T>
T PostOrder(BiNode<T>* root)
{
if(root==NULL)return;
{
PostOrder(root->lchild);
PostOrder(root->rchild);
return root->data;
}
}
template<class T>
T LevelOrder(BiNode<T>* root)
{
int front=0,rear=0;
BiNode* q;
int Q[100];
if(root==NULL)return;
Q[++rear]=root->data;
while(front!=rear)
{
q->data=Q[++front];
cout<<q->data;
if(q->lchild!=NULL)Q[++rear]=q->lchild->data;
if(q->rchild!=NULL)Q[++rear]=q->rchild->data;
}
}
template<class T>
void Release(BiNode<T>* root)
{
/* 注意if只包含了一条语句,没包含后面的 */
if(root!=NULL)
Release(root->lchild);
Release(root->rchild);
delete root;
}
//~BiTree()
//{
// Release(root);
//}//
private:
template<class T>
BiNode<T>* root;
void Creat();
void Release();
};
main()
{
BiTree<int>* obj1;
int ch;
int i,a,b=0;
int root1;
cout<<"输入二叉树";
obj1.Creat(root1);/* root1是什么类型?Creat需要的参数是什么类型? */
while(b=1)
{
cout<<"\t********** select ************\n" ;
cout<<"\t1:前序遍历 " ;
cout<<"\t2:中序遍历\n";
cout<<"\t3: 后序遍历\n" ;
cout<<"\t4: 层序遍历\n" ;
cout<<"\t0: 退出\n" ;
cout<<"\t******************************\n" ;
cout<<"请选择:";
cin>>i;
switch(i)
{
case 1:
obj1.PreOrder(root1);
break;
case 2:
obj1.InOrder(root1);
break;
case 3:
obj1.PostOrder(root1);
break;
case 4:
obj1.LevelOrder(root1);
break;
case 5:
b=0;
break;
}
return 0;
}
}
首先,我本想帮你仔细的把所有错误改完,形成一个正确的二叉树模板代码。
但是,我发现除了十几个模板类声明错误以外,还发现一些函数调用的错误(比如需要返回值的函数你返回了空)。
所以我估计,你这些代码要重写。
大体逻辑是对的,只是过多的细节和结构有问题。你应该好好复习一下关于模板类、模板函数。
为了不使原有的知识和模板知识混淆,且目标是构造二叉树,你先不用模板类,直接为int,接着再把int全改成模板T类型。
另外,我只能把错误给你指出来,但是由于你这个程序整体结构设计有点问题,所以不能基于你已有的代码改成完全正确的。
#include<iostream>
using namespace std;
template<class T>
struct BiNode
{
T data;
BiNode * lchild,* rchild;
}; /* 这个没问题 */
/* 这个有大问题 ,template<typename T>应该加在类前面 */
class BiTree
{
public:
BiTree(){root=NULL;}
// ~BiTree();
void PreOrder();
void InOrder();
void PostOrder();
void LevelOrder();
/* 这下面的每一个template<class T>都可以去掉 由于整个类已经是模板化了 */
template<class T>
void Creat(BiNode<T>* root)
{
int ch;
cin>>ch;/* 为了保证结构与使用分离,所有二叉树操作函数都不应该涉及到用户直接输入的东西 */
if(ch == '#')
{
root = NULL;
}
else
{
root=new BiNode<T>;
root->data=ch;
Creat(root->lchild);
Creat(root->rchild);
}
}
template<class T>
T PreOrder(BiNode<T>* root)
{
if(root==NULL)return;/* T类型的函数是不能返回void的,后面也出现了同样的问题 */
else
{
cout<<root->data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
T InOrder(BiNode<T>* root)
{
if(root==NULL)return;
else
{
InOrder(root->lchild);
return root->data;
InOrder(root->rchild);
return root->data;
}
}
template<class T>
T PostOrder(BiNode<T>* root)
{
if(root==NULL)return;
{
PostOrder(root->lchild);
PostOrder(root->rchild);
return root->data;
}
}
template<class T>
T LevelOrder(BiNode<T>* root)
{
int front=0,rear=0;
BiNode* q;
int Q[100];
if(root==NULL)return;
Q[++rear]=root->data;
while(front!=rear)
{
q->data=Q[++front];
cout<<q->data;
if(q->lchild!=NULL)Q[++rear]=q->lchild->data;
if(q->rchild!=NULL)Q[++rear]=q->rchild->data;
}
}
template<class T>
void Release(BiNode<T>* root)
{
/* 注意if只包含了一条语句,没包含后面的 */
if(root!=NULL)
Release(root->lchild);
Release(root->rchild);
delete root;
}
//~BiTree()
//{
// Release(root);
//}//
private:
template<class T>
BiNode<T>* root;
void Creat();
void Release();
};
main()
{
BiTree<int>* obj1;
int ch;
int i,a,b=0;
int root1;
cout<<"输入二叉树";
obj1.Creat(root1);/* root1是什么类型?Creat需要的参数是什么类型? */
while(b=1)
{
cout<<"\t********** select ************\n" ;
cout<<"\t1:前序遍历 " ;
cout<<"\t2:中序遍历\n";
cout<<"\t3: 后序遍历\n" ;
cout<<"\t4: 层序遍历\n" ;
cout<<"\t0: 退出\n" ;
cout<<"\t******************************\n" ;
cout<<"请选择:";
cin>>i;
switch(i)
{
case 1:
obj1.PreOrder(root1);
break;
case 2:
obj1.InOrder(root1);
break;
case 3:
obj1.PostOrder(root1);
break;
case 4:
obj1.LevelOrder(root1);
break;
case 5:
b=0;
break;
}
return 0;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询