我的三个遍历函数都不接受参数,我尝试了修改,但是没能成功。
我该如何改正。
```c++
#include<iostream>
using namespace std;
const int Maxsize = 100;
template <class T>
struct BiNode
{
T data;
BiNode *lchild;
BiNode* rchild;
};
template<class T>
class BiTree
{
public:
BiTree() { r = Creat(); } //构造函数,建立一棵二叉树
~BiTree() { Release(r); } //析构函数,释放各结点的内存空间
void CreatBTNode(char* str);
void PreOrder() { PreOrder(r); } //先序遍历
void InOrder() { InOrder(r); } //中序遍历
void PostOrder() { PostOrder(r); } //后序遍历
void DispBiNode(); //将二叉链转换成括号表示法
private:
BiNode<T>* Creat(); //构造函数调用
void Release(BiNode<T>* bt); //析构函数调用
friend void PreOrder(BiNode<T>* bt); //先序遍历函数调用
friend void InOrder(BiNode<T>* bt); //中序遍历函数调用
friend void PostOrder(BiNode<T>* bt); //后序遍历函数调用
friend void DispBiNode(BiNode<T>* bt); //被DispBiNode函数调用
BiNode<T>* r; //指向根结点的头指针
};
template<class T>
BiNode<T>* BiTree<T>::Creat() //构造函数实现
{
BiNode<T>* bt;
char ch;
cin >> ch; //输入结点数据信息,设定为字符
if (ch == '#') bt = NULL; //建立一颗空树
else {
bt = new BiNode<T>;
bt->data = ch;
bt->lchild = Creat();
bt->rchild = Creat();
}
}
template<class T>
void BiTree<T>::Release(BiNode<T>* bt) //析构函数实现
{
if (bt == NULL) return;
else {
Release(bt->lchild); //释放左子树
Release(bt->rchild); //释放右子树
delete bt; //释放根结点
}
}
template <class T>
void BiTree<T>::CreatBTNode(char* str) //创建以r为根结点的二叉链存储结构
{
BiNode<T>* St[Maxsize]; //建立一个顺序栈
BiNode<T>* p;
int top = -1, k = 0, j = 0;
char ch;
while (str[j] != '\0') //循环扫描str中每个字符
{
ch = str[j];
switch (ch)
{
case '(':top++; St[top] = p; k = 1; break; //新建结点有孩子,将其进栈
case ')':top--; break;
case ',':k = 2; break; //开始处理右孩子结点
default: p = new BiNode<T>(); //新建一个结点
p->lchild = p->rchild = NULL;
p->data = ch;
if (r == NULL) r = p; //若未建立根结点,*p作为根结点
else //已建立二叉树根结点
{
switch (k)
{
case 1:St[top]->lchild = p; break;//新建结点作为栈顶结点的左孩子
case 2:St[top]->rchild = p; break;//新建结点作为栈顶结点的右孩子
}
}
break;
}
j++; //继续遍历其他字符
}
}
template<class T>
void PreOrder(BiNode<T>* bt) //前序遍历函数实现
{
if (bt == NULL) return; //递归调用的结束条件
else {
cout << bt->data << "\t"; //访问根结点bt的数据域
PreOrder(bt->lchild); //前序递归遍历bt的左子树
PreOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
template<class T>
void InOrder(BiNode<T>* bt) //中序遍历函数实现
{
if (bt == NULL) return; //递归调用的结束条件
else {
InOrder(bt->lchild); //中序递归遍历bt的左子树
cout << bt->data << "\t"; //访问根结点bt的数据域
InOrder(bt->rchild); //中序递归遍历bt的右子树
}
}
template<class T> //后序遍历函数实现
void PostOrder(BiNode<T>* bt) //中序遍历函数实现
{
if (bt == NULL) return; //递归调用的结束条件
else {
PostOrder(bt->lchild); //后序递归遍历bt的左子树
PostOrder(bt->rchild); //后序递归遍历bt的右子树
cout << bt->data << "\t"; //访问根结点bt的数据域
}
}
template <typename T>
void BiTree<T>::DispBiNode() //将二叉链转换成括号表示法
{
DispBiNode(r);
}
template <typename T>
void DispBiNode(BiNode<T>* bt) //被DispBiNode函数调用
{
if (bt != NULL)
{
cout << bt->data; //输出根结点值
if (bt->lchild != NULL || bt->rchild != NULL)
{
cout << "("; //有孩子结点时输出"("
DispBiNode(bt->lchild); //递归输出左子树
if (bt->rchild != NULL)
cout << ","; //有右孩子结点时输出","
DispBiNode(bt->rchild); //递归输出右子树
cout << ")"; //输出")"
}
}
}
int main()
{
char str1[]="A(B(D(,G)),C(E,F))";
char* str = str1;
BiTree<char> T{};
T.CreatBTNode(str); //创建二叉链存储结构
cout << "二叉树bt:"; T.DispBiNode(); cout << endl;
cout << "前序遍历结果:" << endl;
T.PreOrder(); //前序递归遍历函数调用
cout << "中序遍历结果:" << endl;
T.InOrder(); //中序递归遍历函数调用
cout << "后序遍历结果:" << endl;
T.PostOrder(); //后序递归遍历函数调用
T.~BiTree(); //析构函数调用,释放空间
return 0;
}
```