• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            l

            成都手游碼農一枚
            隨筆 - 32, 文章 - 0, 評論 - 117, 引用 - 0
            數據加載中……

            [C++]二叉樹的鏈式描述。創建,遍歷,摧毀。

            前段時間寫的,不好的地方請支持,謝謝。

            /*********************************************************
            FileName:BinaryTree.cpp
            Author    :shly
            Date    :2009.9.1
            E-mail    :xlq1989@vip.qq.com
            *二叉樹的鏈式描述。創建,遍歷,摧毀。
            ********************************************************
            */

            #include 
            <iostream>
            #include 
            <deque>
            #include 
            <cassert>
            #include 
            <cstring>
            using namespace std;

            template
            <typename _Ty>
            struct BinNode
            {
                BinNode():pLeft(NULL),pRight(NULL)
                
            {
                
            //    cout<<nNode<<endl;++nNode;
                }

                BinNode
            <_Ty> *pLeft, *pRight;
                _Ty    tData;

                
            //test---
                
            //~BinNode(){--nNode;cout<<nNode<<endl;}
                
            //    static int nNode;
            }
            ;
            //template<typename _Ty>
            //int BinNode<_Ty>::nNode=0;

            template
            <typename _Ty>
            class BinaryTree
            {
                BinNode
            <_Ty>* pRoot;
            public:
                BinaryTree():pRoot(NULL)
            {}
                
            ~BinaryTree(){}
            public:
            //    void CreateBinTree(_Ty& tData);
                void CreateBinTree(_Ty* tpStart,int nSize);
                
            void DestroyBinTree();
            //    void AddBinTree(BinaryTree* pLeft,BinaryTree* pRight);
                void PreOrder();
                
            void InOrder();
                
            void PostOrder();
                
            void LevelOrder();
                
            void Vista(const _Ty& tData);
            private
                
            void _destroy(BinNode<_Ty>* pNode);
                
            void _pre(BinNode<_Ty>* pNode);
                
            void _in(BinNode<_Ty>* pNode);
                
            void _post(BinNode<_Ty>* pNode);
            }
            ;

            /*********************************************************
            *Function    :CreateBinTree
            *parameter    :_Ty tData
            *return        :void
            *為pRoot創建一個結點。
            ********************************************************
            */

            //template<typename _Ty>void BinaryTree<_Ty>::CreateBinTree(_Ty& tData){
            //    assert(NULL==pRoot);
            //    pRoot=new BinNode<_Ty>;
            //    assert(NULL!=pRoot);
            //
            //    pRoot->tData=tData;
            //    pRoot->pLeft=pRoot->pRight=NULL;
            //}
            /*********************************************************
            *Function    :CreateBinTree
            *parameter    :_Ty* tpStart,int nSize
            *return        :void
            *根據一組數據順序生成一顆二叉樹。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::CreateBinTree(_Ty* tpStart,int nSize)
            {
                assert(tpStart
            &&!pRoot&&nSize>0);

                deque
            <BinNode<_Ty>**> dq;
                dq.push_back(
            &pRoot);
                
                
            for(int i=0;i<nSize;)
                
            {
                    BinNode
            <_Ty>** pb=dq.front();
                    dq.pop_front();
                    assert(NULL
            ==(*pb));
                    (
            *pb)=new BinNode<_Ty>;
                    (
            *pb)->tData=tpStart[i++];
                    dq.push_back(
            &(*pb)->pLeft);
                    dq.push_back(
            &(*pb)->pRight);
                }

            }

            /*********************************************************
            *Function    :AddBinTree
            *parameter    :BinaryTree* pLeft,* pRight
            *return        :void
            *將兩個子樹組合成一個。
            ********************************************************
            */

            //template<typename _Ty>void BinaryTree<_Ty>::AddBinTree(BinaryTree* pLeft,BinaryTree* pRight){
            //    assert(NULL!=pLeft);
            //    assert(NULL!=pRight);
            //    assert(NULL!=pRoot);
            //    assert(NULL==pRoot->pLeft);
            //    assert(NULL==pRoot->pRight);
            //
            //    pRoot->pLeft=pLeft;
            //    pRoot->pRight=pRight;
            //
            //    pLeft=pRight=0;
            //}
            /*********************************************************
            *Function    :DestroyBintree
            *parameter    :void
            *return        :void
            *摧毀二叉樹。
            ********************************************************
            */

            template
            <typename _Ty>void BinaryTree<_Ty>::_destroy(BinNode<_Ty>* pNode){
            /*    if(NULL==pNode)return;
                if(NULL==pNode->pLeft
                 &&NULL==pNode->pRight){
                    delete pNode;
                    static int i=0;
                    ++i;
                    cout<<i<<"__";
                    pNode=NULL;
                //    cout<<"Destroy BinaryTree!"<<endl;
                }
                else{
                    _destroy(pNode->pLeft);
                    _destroy(pNode->pRight);
                }
            */

                
            if(!pNode)return;
                _destroy(pNode
            ->pLeft);
                _destroy(pNode
            ->pRight);
                delete pNode;
                pNode
            =NULL;
            }

            template
            <typename _Ty>
            inline 
            void BinaryTree<_Ty>::DestroyBinTree()
            {
                _destroy(pRoot);
            }


            /*********************************************************
            *Function    :PreOrder
            *parameter    :void
            *return        :void
            *先序遍歷。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::_pre(BinNode<_Ty>* pNode)
            {
                
            if(!pNode)return;
                Vista(pNode
            ->tData);
                _pre(pNode
            ->pLeft);
                _pre(pNode
            ->pRight);
            }

            template
            <typename _Ty>
            inline 
            void BinaryTree<_Ty>::PreOrder()
            {
                _pre(pRoot);
            }

            /*********************************************************
            *Function    :InOrder
            *parameter    :void
            *return        :void
            *中序遍歷。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::_in(BinNode<_Ty>* pNode)
            {
                
            if(!pNode)return;
                _in(pNode
            ->pLeft);
                Vista(pNode
            ->tData);
                _in(pNode
            ->pRight);
            }

            template
            <typename _Ty>
            inline 
            void BinaryTree<_Ty>::InOrder()
            {
                _in(pRoot);
            }

            /*********************************************************
            *Function    :PostOrder
            *parameter    :void
            *return        :void
            *后序遍歷。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::_post(BinNode<_Ty>* pNode)
            {
                
            if(!pNode)return;
                _post(pNode
            ->pLeft);
                _post(pNode
            ->pRight);
                Vista(pNode
            ->tData);
            }

            template
            <typename _Ty>
            inline 
            void BinaryTree<_Ty>::PostOrder()
            {
                _post(pRoot);
            }

            /*********************************************************
            *Function    :LevelOrder
            *parameter    :void
            *return        :void
            *逐層遍歷。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::LevelOrder()
            {
                
            if(!pRoot)return;
                deque
            <BinNode<_Ty>*> dq;
                dq.push_back(pRoot);
                
            while(!dq.empty())
                
            {
                    BinNode
            <_Ty>* temp=dq.front();
                    dq.pop_front();
                    Vista(temp
            ->tData);
                    
            if(NULL!=temp->pLeft)
                        dq.push_back(temp
            ->pLeft);
                    
            if(NULL!=temp->pRight)
                        dq.push_back(temp
            ->pRight);
                }

            }

            /*********************************************************
            *Function    :Vista
            *parameter    :const _Ty& tData
            *return        :void
            *訪問操作。
            ********************************************************
            */

            template
            <typename _Ty>
            void BinaryTree<_Ty>::Vista(const _Ty& tData)
            {
                
            if(' '!=tData)
                    cout
            <<tData<<" ";
            }


            int main()
            {
                
            //char* arr="+*/abcd";
                
            //char* arr="++d+c  ab";
                char* arr="/+*-++* axy bca";
                BinaryTree
            <char> bt;
                bt.CreateBinTree(arr,strlen(arr));
            //創建二叉樹
                bt.PreOrder();//先序遍歷
                cout<<endl;
                bt.InOrder();
            //中序遍歷
                cout<<endl;
                bt.PostOrder();
            //后序遍歷
                cout<<endl;
                bt.LevelOrder();
            //逐層遍歷
                cout<<endl;
                bt.DestroyBinTree();
            //摧毀二叉樹
                return 0;
            }

            posted on 2009-09-01 00:58 l1989 閱讀(968) 評論(2)  編輯 收藏 引用 所屬分類: 數據結構

            評論

            # re: [C++]二叉樹的鏈式描述。創建,遍歷,摧毀。  回復  更多評論   

            弱弱的說...刪除那段似乎刪了樹葉...留了個樹干 - -
            2009-09-01 10:10 | Ocean.Tu

            # re: [C++]二叉樹的鏈式描述。創建,遍歷,摧毀。  回復  更多評論   

            謝謝LS提醒,已經改了。
            這些東西真麻煩哦。。
            2009-09-01 12:37 | shly
            久久99精品久久只有精品| 亚洲精品乱码久久久久久蜜桃| 国产一区二区精品久久凹凸| 综合人妻久久一区二区精品| 国产精品午夜久久| 亚洲午夜久久影院| 国产欧美一区二区久久| 久久精品国产精品亚洲毛片| 亚洲国产精品久久电影欧美| 久久成人国产精品免费软件| 久久精品国产AV一区二区三区 | 久久亚洲精品无码播放| 国产精品久久久久国产A级| 久久精品一区二区三区AV| 亚洲国产精品无码成人片久久| 亚洲精品国精品久久99热一| 久久精品国产免费观看三人同眠| 久久精品久久久久观看99水蜜桃 | 久久这里只精品99re66| 久久中文精品无码中文字幕| 久久狠狠一本精品综合网| 久久成人精品| 亚洲精品无码久久一线| 一本久久久久久久| 久久精品成人国产午夜| 久久国产欧美日韩精品| 亚洲αv久久久噜噜噜噜噜| 亚洲精品成人久久久| 欧美久久一级内射wwwwww.| 国产成人AV综合久久| 93精91精品国产综合久久香蕉 | 国产精品久久网| 久久亚洲高清观看| 久久91精品国产91久久户| 久久午夜电影网| 久久av免费天堂小草播放| 开心久久婷婷综合中文字幕| 欧美久久天天综合香蕉伊| 久久久久久久波多野结衣高潮 | 品成人欧美大片久久国产欧美| 狠狠干狠狠久久|