二叉树(C++)

简介

采用面向对象的方法创建二叉树

代码

#include <iostream>

using namespace std;

template<class T>
struct BiNode
{
    T data;
    BiNode<T>* left;
    BiNode<T>* right;
    BiNode(const T& x) : data(x), left(NULL), right(NULL) {}
};

template<class T>
class BiTree
{
public:
    //构造一颗树
    //T类型的指针a,传参时传一个数组,负责传入数据
    //size保存数组a 的大小
    //index记录下标
    //invalid表示非法值。
    BiTree(T* a, size_t n, const T&invalid)
    {
        size_t index = 0;
        root = CreateTree(a, n, invalid, index);
    }

    ~BiTree()
    {
        Destroy(root);
    };

    void PreOrder()
    {
        Pre(root);
    }

     void InOrder()
    {
        In(root);
    }

     void PostOrder()
    {
        Post(root);
    }


private:
    BiNode<T>* root = NULL;     //树根
    BiNode<T>* CreateTree(const T *a, size_t size, const T& invalid, size_t &index);//创建一棵树
    void Destroy(BiNode<T>* all_node);  //销毁一棵树
    void Visit(BiNode<T>* node);        //访问节点
    void Pre(BiNode<T>* node);          //先序
    void In(BiNode<T>* node);           //中序
    void Post(BiNode<T>* node);         //后序
};

template<class T>
BiNode<T>* BiTree<T>::CreateTree(const T *a, size_t size, const T& invalid, size_t &index)
{
    BiNode<T>* node = NULL;
    if (a[index] != invalid)
        {
            node = new BiNode<T>(a[index]);
            //root->data = a[index];
            node->left = CreateTree(a, size, invalid, ++index);
            node->right = CreateTree(a, size, invalid, ++index);
     }
     return node;
}

template<class T>
void BiTree<T>::Destroy(BiNode<T>* all_node)
{
    BiNode<T>* node = all_node;
    if (node)
    {
        Destroy(node->left);
        Destroy(node->right);
        delete node;
        node = NULL;
    }
}

template<class T>
void BiTree<T>::Visit(BiNode<T>* node)
{
    if(node)
    {
        cout << node->data << " ";
    }
}

template<class T>
void BiTree<T>::Pre(BiNode<T>* node)
{
    if(node)
    {
        Visit(node);
        Pre(node->left);
        Pre(node->right);
    }
}

template<class T>
void BiTree<T>::In(BiNode<T>* node)
{
    if(node)
    {
        In(node->left);
        Visit(node);
        In(node->right);
    }
}

template<class T>
void BiTree<T>::Post(BiNode<T>* node)
{
    if(node)
    {
        Visit(node);
        Pre(node->left);
        Pre(node->right);
    }
}


int main()
{
    int array[] = {1, 2, 3, -1, -1, 4, -1, -1, 2, 4, -1, -1, 3, -1, -1};
    BiTree<int> root(array, sizeof(array), -1);
    root.PreOrder();
    cout << endl;
    root.InOrder();
    cout << endl;
    root.PostOrder();
    return 0;
}

输出

先序:1 2 3 4 2 4 3
中序:3 2 4 1 4 2 3
后序:1 2 3 4 2 4 3

树结构

   
    1
   / \
  2   2
 / \ / \
3  4 4  3

猜你喜欢

转载自blog.csdn.net/qq_36784975/article/details/88358283