1. 程式人生 > >STL實現二叉樹遍歷

STL實現二叉樹遍歷

nod 數據 blog new friend const turn ace lrn

#include<iostream>
using namespace std;
template<class Type>
class BSTree;
template<class Type>
class BinaryNode
{
    friend class BSTree<Type>;
    public:
        BinaryNode():left(NULL),right(NULL){}
        BinaryNode(const Type& value):data(value),left(NULL),right(NULL){}
    private:
        Type data;
        BinaryNode *left;
        BinaryNode *right;
};
template<class Type>
class BSTree{
    BinaryNode<Type>*root;
    public:
        BSTree():root(NULL){}
        BinaryNode<Type>* GetRoot() const{return root;}
        Type AddValue(const Type& value);
        void printData_NLR(const BinaryNode<Type>*startNode);//前序遍歷
        void printData_LNR(const BinaryNode<Type>*startNode);//中序遍歷
        void printData_LRN(const BinaryNode<Type>*startNode);//後序遍歷
        void Cout()
        {
        }
};
template<class Type>
Type BSTree<Type>::AddValue(const Type& value)
{
    if(root==NULL)
    {
        root=new BinaryNode<Type>(value);
    }
    else
    {
        BinaryNode<Type>* node=root;
        while(1)
        {
            if(value>node->data)
            {
                if(node->right==NULL)
                {
                    node->right=new BinaryNode<Type>(value);
                    break;
                }
                else
                {
                    node=node->right;
                }
            }
                else
                {
                    if(node->left==NULL)
                    {
                        node->left=new BinaryNode<Type>(value);
                        break;
                    }else
                    {
                        node=node->left;
                    }
                }
        }
    }
}
//前序遍歷
template<class Type>
void BSTree<Type>::printData_NLR(const BinaryNode<Type>* startNode)
{
    if(startNode==NULL)
    {
        return ;
    }
    else
    {
        cout<<startNode->data<<" ";
        printData_NLR(startNode->left);
        printData_NLR(startNode->right);
    }
}
//中序遍歷
template<class Type>
void BSTree<Type>::printData_LNR(const BinaryNode<Type> *startNode)
{
    if(startNode==NULL)
    {
        return ;
    }
    else
    {
        printData_LNR(startNode->left);
        cout<<startNode->data<<" ";
        printData_LNR(startNode->right);
    }
}
//後序遍歷
template<class Type>
void BSTree<Type>::printData_LRN(const BinaryNode<Type> *startNode)
{
    if(startNode==NULL)
    {
        return ;
    }
    else
    {
        printData_LRN(startNode->left);
        printData_LRN(startNode->right);
        cout<<startNode->data<<" ";
    }
}
int main()
{
    BSTree<int> tree;
    //填充數據
    tree.AddValue(7);
    tree.AddValue(4);
    tree.AddValue(10);
    tree.AddValue(1);
    tree.AddValue(5);
    tree.AddValue(-1);
    tree.AddValue(9);
    tree.AddValue(13);
    tree.AddValue(12);
    tree.AddValue(11);
    tree.AddValue(14);
    tree.AddValue(19);
    cout<<"前序遍歷:根節點->左子樹->右子樹"<<endl;
    tree.printData_NLR(tree.GetRoot());
    cout<<"\n中序遍歷:左子樹->根節點->右子樹"<<endl;
    tree.printData_LNR(tree.GetRoot());
    cout<<"\n後序遍歷:左子樹->右子樹->根節點"<<endl;
    tree.printData_LRN(tree.GetRoot());
    return 0;
}

STL實現二叉樹遍歷