• <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, 評(píng)論 - 117, 引用 - 0
            數(shù)據(jù)加載中……

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

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

            /*********************************************************
            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 閱讀(947) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            評(píng)論

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

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

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

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

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


            2021久久精品免费观看| 亚洲精品午夜国产VA久久成人| 一本一本久久aa综合精品| 国产真实乱对白精彩久久| 国产精品久久网| 久久99国产亚洲高清观看首页| 人妻无码中文久久久久专区| 亚洲伊人久久精品影院| 亚洲午夜久久久久久久久电影网| 麻豆精品久久久久久久99蜜桃| 国产99久久久国产精品小说| 精品久久久久久久国产潘金莲| 国产精品成人久久久| 东方aⅴ免费观看久久av| 色综合久久久久无码专区| 亚洲伊人久久精品影院| 久久精品无码专区免费青青| 99久久精品毛片免费播放| 91精品国产综合久久香蕉| 久久se这里只有精品| 色悠久久久久久久综合网| 久久久国产99久久国产一| 三上悠亚久久精品| 久久久久久a亚洲欧洲aⅴ| 国产精品久久久久一区二区三区| 青青草国产97免久久费观看| 2021国内久久精品| A狠狠久久蜜臀婷色中文网| 99热精品久久只有精品| 久久亚洲精品无码观看不卡| 无码AV中文字幕久久专区| 亚洲精品高清久久| 无码8090精品久久一区| 久久久久亚洲精品天堂| 国产亚洲色婷婷久久99精品91| 久久久久亚洲av综合波多野结衣 | 99久久久国产精品免费无卡顿 | 无码人妻少妇久久中文字幕| 亚洲国产精品成人久久| 国产成人无码精品久久久免费| 精品综合久久久久久98|