,二叉树问题 高手帮忙解决下

初学模板,二叉树问题..请高手帮忙解决下。..#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
展开
 我来答
Monkey家园
推荐于2016-04-17 · TA获得超过5635个赞
知道大有可为答主
回答量:1134
采纳率:60%
帮助的人:606万
展开全部
- -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;
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式