• <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

            成都手游碼農(nóng)一枚
            隨筆 - 32, 文章 - 0, 評論 - 117, 引用 - 0
            數(shù)據(jù)加載中……

            [C++]二叉樹的鏈?zhǔn)矫枋觥?chuàng)建,遍歷,摧毀。

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

            /*********************************************************
            FileName:BinaryTree.cpp
            Author    :shly
            Date    :2009.9.1
            E-mail    :xlq1989@vip.qq.com
            *二叉樹的鏈?zhǔn)矫枋觥?chuàng)建,遍歷,摧毀。
            ********************************************************
            */

            #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創(chuàng)建一個(gè)結(jié)點(diǎn)。
            ********************************************************
            */

            //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
            *根據(jù)一組數(shù)據(jù)順序生成一顆二叉樹。
            ********************************************************
            */

            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
            *將兩個(gè)子樹組合成一個(gè)。
            ********************************************************
            */

            //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));
            //創(chuàng)建二叉樹
                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 閱讀(958) 評論(2)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            評論

            # re: [C++]二叉樹的鏈?zhǔn)矫枋觥?chuàng)建,遍歷,摧毀。  回復(fù)  更多評論   

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

            # re: [C++]二叉樹的鏈?zhǔn)矫枋觥?chuàng)建,遍歷,摧毀。  回復(fù)  更多評論   

            謝謝LS提醒,已經(jīng)改了。
            這些東西真麻煩哦。。
            2009-09-01 12:37 | shly

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久er99热精品一区二区| 欧美亚洲另类久久综合| 久久久网中文字幕| 思思久久99热免费精品6| 国内精品综合久久久40p| 精品久久人妻av中文字幕| 热99re久久国超精品首页| 久久精品无码一区二区app| 久久久精品人妻一区二区三区蜜桃| 久久久久久久亚洲Av无码| 日本精品久久久久中文字幕8| 国产精品日韩深夜福利久久| 77777亚洲午夜久久多喷| 久久国产精品波多野结衣AV| 色播久久人人爽人人爽人人片AV| 亚洲精品高清国产一久久| 欧美一区二区三区久久综| 久久久久国产日韩精品网站 | 久久精品国产一区二区三区日韩| 久久久久99精品成人片三人毛片| 亚洲午夜久久久久久久久久| 亚洲国产婷婷香蕉久久久久久| 国产精品久久久久久吹潮| 国内精品久久久久影院薰衣草| 久久最新免费视频| 97久久精品人人做人人爽| 久久99国产精品久久99果冻传媒| 精品国产日韩久久亚洲 | 成人妇女免费播放久久久| 无码AV中文字幕久久专区| 久久综合偷偷噜噜噜色| 国产精品成人99久久久久| 久久中文字幕一区二区| 久久最新精品国产| 国产精品欧美久久久久无广告| 精品一区二区久久| 国产一区二区精品久久凹凸| 国产成人久久777777| 国产精品成人99久久久久91gav | 久久av免费天堂小草播放| 久久精品无码一区二区三区免费 |