【源代码】C++算法(六)二叉树(先序,中序,后序遍历)

日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。

更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
这里写图片描述

BinaryNode.h

/**********************************
* algorithms.h :结点类*
* author : shilei                 *
* created : 2018.4.9          *
***********************************/

#include <cstdlib>
#include <iostream>
using namespace std;
template<class T>

class BiNode
{
public:
    T data;
    BiNode<T> *lchild, *rchild;
    BiNode(T data,BiNode<T>*lchild = NULL,BiNode<T>*rchild = NULL)
    {
        this->data = data;
        this->lchild = lchild;
        this->rchild = rchild;
    }
};

BiTree.h

/**********************************
* algorithms.h :二叉树建造和三种遍历*
* author : shilei                *
* created : 2018.4.9             *
***********************************/
#include "BinaryNode.h"
using namespace std;
#define  ElemType  int

template <class T>
class BiTree
{
public:
    BiNode<T> *root;//指向根结点
    BiTree();//构造空树
    ~BiTree();
    BiTree(T prelist[],int n);
    bool empty();
    void InOrder();
    void PostOrder();
    friend ostream& operator<<<>(ostream&, BiTree<T>&);//先序遍历输出

private:
    BiNode<T>*CreatTree(T prelist[], int n, int&i);//先序遍历构造二叉树
    void PreOrder(BiNode<T>*p);
    void InOrder(BiNode<T>*p);
    void PostOrder(BiNode<T>*p);//遍历以P结点为根的子树
};
template<class T>
BiTree<T>::BiTree()
{
    this->root = NULL;
}
template<class T>
BiTree<T>::~BiTree()
{
}
template<class T>
bool BiTree<T>::empty()
{
    return this->root == NULL;
}
template<class T>
BiTree<T>::BiTree(T prelist[],int n)
{
    int i = 0;
    this->root = this->CreatTree(prelist, n, i);
}
template<class T>
BiNode<T>*BiTree<T>::CreatTree(T prelist[], int n, int&i)
{

    BiNode<T>*p = NULL;
    if (i<n)
    {
        T data = prelist[i];
        i++;
        if (data =='#')
        {
            p = new BiNode<T>(data);
            p->lchild = NULL;
            p->rchild = NULL;
        }
        else
        {
            p = new BiNode<T>(data);//创建新的结点
            p->lchild = CreatTree(prelist, n, i);
            p->rchild = CreatTree(prelist, n, i);//递归调用
        }
    }
    return p;
}

template<class T>
ostream& operator<<<>(ostream&out,BiTree<T>&Btree)//重载输出符,输出树的元素
{
    out << "先序遍历二叉树: ";
    Btree.PreOrder(Btree.root);//调用先序遍历的递归函数,提供从根节点遍历的函数
    out << endl;
    return out;
}

template<class T>
void BiTree<T>::PreOrder(BiNode<T>*p)//先序遍历递归调用
{
    if (p != NULL)
    {
        if (p->data != '#')
        {
            cout << p->data << " ";
            PreOrder(p->lchild);
            PreOrder(p->rchild);
        }
        else
        {
            PreOrder(p->lchild);
            PreOrder(p->rchild);
        }
    }
}
template<class T>
void BiTree<T>::InOrder()//中序遍历输出
{
    cout << "中序遍历二叉树: ";
    this->InOrder(root);//提供从根节点遍历的函数,调用中序遍历的递归函数
    cout << endl;

}
template<class T>
void BiTree<T>::InOrder(BiNode<T>*p)
{
    /*if ( p != NULL)
    {
        InOrder(p->lchild);
        InOrder(p->rchild);
        cout << p->data << " ";

    }*/
    if (p!=NULL)
    {
        if (p->data != '#')
        {
            InOrder(p->lchild);
            cout << p->data << " ";
            InOrder(p->rchild);
        }
        else
        {
            InOrder(p->lchild);
            InOrder(p->rchild);
        }
    }

}
template<class T>
void BiTree<T>::PostOrder()//中序遍历输出
{
    cout << "后序遍历二叉树: ";
    this->PostOrder(root);//提供从根节点遍历的函数,调用后序遍历的递归函数
    cout << endl;

}
template<class T>
void BiTree<T>::PostOrder(BiNode<T>*p)
{
    /*if ( p != NULL)
    {
        PostOrder(p->lchild);
        PostOrder(p->rchild);
        cout << p->data << " ";
    }*/
    if (p!=NULL)
    {
        if (p->data != '#')
        {
            PostOrder(p->lchild);
            PostOrder(p->rchild);
            cout << p->data << " ";
        }
        else
        {
            PostOrder(p->lchild);
            PostOrder(p->rchild);
        }
    }
}

BiTree.cpp

/**********************************
* algorithms.h :main*
* author : shilei                *
* created : 2018.4.9             *
***********************************/
#include "BiTree.h"
using namespace std;

int main()
{

    cout << "请输入数组元素的个数:";
    int n;
    cin >> n;
    char *prelist = new char[n];
    /*int n = 21;
    char prelist[] = { 'A','B','#','C','I','#','#','#','D','E','H','#','#','#','F','J','#','#','G','#','#' };*/
    for (int i = 0; i < n; i++)
    {
        cin >> prelist[i];
    }
    BiTree<char>Bitree(prelist,n);
    cout << endl;
    cout << Bitree;
    cout << endl;
    Bitree.InOrder();
    cout << endl;
    Bitree.PostOrder();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/handoking/article/details/79904197
今日推荐