旭辉夜夜访
2022-05-08 02:18
采纳率: 100%
浏览 11

C++二叉树遍历函数不接受参数

我的三个遍历函数都不接受参数,我尝试了修改,但是没能成功。
我该如何改正。

img


```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;
}


```

1条回答 默认 最新

相关推荐 更多相似问题