• <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 閱讀(948) 評論(2)  編輯 收藏 引用 所屬分類: 數據結構

            評論

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

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

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

            謝謝LS提醒,已經改了。
            這些東西真麻煩哦。。
            2009-09-01 12:37 | shly
            国产69精品久久久久APP下载| 久久久黄色大片| 色综合久久久久无码专区| 国内精品久久久久影院网站| 久久精品一区二区三区AV| 一本大道久久东京热无码AV | 久久国产亚洲精品无码| 欧美激情精品久久久久久久| 99热热久久这里只有精品68| 91精品国产高清91久久久久久| 久久亚洲精品中文字幕| 久久国产欧美日韩精品| 丁香五月网久久综合| 久久精品免费观看| 精品国产一区二区三区久久蜜臀| 波多野结衣中文字幕久久 | 国产精品久久波多野结衣| 久久国产色AV免费看| 国产高清国内精品福利99久久| 久久99精品久久久久久齐齐| 久久毛片免费看一区二区三区| 久久夜色精品国产亚洲av| 色播久久人人爽人人爽人人片AV| 亚洲综合精品香蕉久久网| 国产成人精品久久二区二区| 久久国产精品一区| 精品国产青草久久久久福利| 国产成人久久精品激情| 亚洲国产精品婷婷久久| 久久久久亚洲国产| 久久成人国产精品二三区| 久久久久这里只有精品 | 亚洲乱码日产精品a级毛片久久| 亚洲精品综合久久| 亚洲国产精品久久| 伊人久久综合成人网| 99久久综合国产精品二区| 99精品国产99久久久久久97| 91精品国产高清久久久久久91 | 国产∨亚洲V天堂无码久久久| 精品久久久久久国产牛牛app|