【数据结构】3-1 二叉树的先序创建及遍历操作

二叉树真的令人头大

#include<iostream>
using namespace std;
template <class T>
struct BTNode//二叉链表结点结构
{
    T data; //二叉树中的元素
    BTNode<T> *lchild, *rchild;
};
template <class T>
class BTree   //二叉树的二叉链表类
{
private:
    BTNode<T> *root; //二叉树的根指针
    BTNode<T>* pre_create();// 先序创建二叉链表结构二叉树r
    void preOrder(BTNode<T>*r);//先序遍历二叉树r
    void inOrder(BTNode<T>*r);//中序遍历二叉树r
    void postOrder(BTNode<T>*r);//后序遍历二叉树r
    void numOfNode(BTNode<T>*r, int &cont);//统计二叉树r中的结点个数
public:
    BTree() { root = NULL; }
    void preCreat();
    void preOrder() { cout << "先序遍历:"; preOrder(root); cout << endl; }//先序遍历二叉树
    void inOrder() { cout << "中序遍历:"; inOrder(root); cout << endl;}//中序遍历二叉树
    void postOrder() { cout << "后序遍历:"; postOrder(root); cout << endl;}//后序遍历二叉树
    int numOfNode();//统计二叉树中的结点个数
};
template<class T>
BTNode<T>* BTree<T>::pre_create()
{
    char ch;
    cin >> ch;
    BTNode<T> *p;
    if (ch =='#')
    {
        p = NULL;
    }
    else
    {
        p = new BTNode<T>();
        p->data = ch;
        p->lchild = pre_create();
        p->rchild = pre_create();
    }
    return p;
}
template<class T>
void BTree<T>::inOrder(BTNode<T>*r)
{
    if (r!=NULL)
    {
        inOrder(r->lchild);
        cout << r->data << " ";
        inOrder(r->rchild);
    }
}
template<class T>
void BTree<T>::postOrder(BTNode<T>*r)
{
    if (r!=NULL)
    {
        postOrder(r->lchild);
        postOrder(r->rchild);
        cout << r->data << " ";
    }
}
template<class T>
void BTree<T>::preOrder(BTNode<T>*r)
{
    if (r!=NULL)
    {
        cout << r->data << " ";
        preOrder(r->lchild);
        preOrder(r->rchild);
    }
}
template<class T>
void BTree<T>::numOfNode(BTNode<T>*r,int &cont)
{
    
    if (r)
    {
        cont++;
        numOfNode(r->lchild,cont);
        numOfNode(r->rchild,cont);
    }
}
template<class T>
void BTree<T>::preCreat()
{
    cout << "请按照先序的方式输入要创建的二叉树,空用#表示" << endl;
    root = pre_create();
    cout << "二叉树创建成功!" << endl;

}
template<class T>
int BTree<T>::numOfNode()
{
    int cont = 0;
    numOfNode(root, cont);
    return cont;

}

int main()
{
    BTree<char> test;
    test.preCreat();
    test.preOrder();
    test.inOrder();
    test.postOrder();
    cout << "二叉树中的节点个数为:" << test.numOfNode() << endl;
    system("pause");
    return 0;
}

输入格式为先序遍历的结果,空用#表示

会自动输出创建好的二叉树的先序,中序,后序遍历的结果

猜你喜欢

转载自www.cnblogs.com/robotpaul/p/9978097.html