∪∩deniable Design

          個(gè)人JAVA版GAE(google app engine),struts2+jpa+jQuery開(kāi)發(fā),互相交流 http://iunbug.appspot.com/

          樹(shù)和二叉樹(shù)

          1. 實(shí)驗(yàn)?zāi)康?/span>

          1.熟悉二叉樹(shù)的二叉鏈表存儲(chǔ)結(jié)構(gòu);

          2.掌握構(gòu)造二叉樹(shù)的方法;

          3.加深對(duì)二叉樹(shù)的遍歷的理解。

          二.需求分析

              本程序演示用C++編寫(xiě),完成按先序遍歷生成二叉樹(shù),先序遍歷打印輸出二叉樹(shù), 后序遍歷打印輸出二叉樹(shù), 中序遍歷打印輸出二叉樹(shù), 層序遍歷打印輸出二叉樹(shù), 先序遍歷方法交換左右子樹(shù),求樹(shù)的高度,求樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù).

          輸入值的范圍:建立一棵二叉時(shí),要求結(jié)點(diǎn)的的左右孩子為空時(shí)輸入0代替.所有輸入值必須為整形.輸入的結(jié)點(diǎn)個(gè)數(shù):若為單邊二叉樹(shù)(全只有左結(jié)點(diǎn)或全只有右結(jié)點(diǎn))則為任意個(gè)數(shù);若非單邊二叉則要求結(jié)點(diǎn)最多的層個(gè)數(shù)不得超過(guò)MAXSIZE的值.

          輸出形式:輸出時(shí)如果結(jié)點(diǎn)的左右指針這空則以" #"代替輸出.

          程序所能完成的功能:程序能完成按先序遍歷生成二叉樹(shù),先序遍歷打印輸出二叉樹(shù), 后序遍歷打印輸出二叉樹(shù), 中序遍歷打印輸出二叉樹(shù), 層序遍歷打印輸出二叉樹(shù), 先序遍歷方法交換左右子樹(shù),求樹(shù)的高度,求樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù).操作.

          測(cè)試數(shù)據(jù)

          A建立二叉樹(shù)中輸入1230000 生成一棵樹(shù)123####

          B交換左右子樹(shù)得到一棵二叉樹(shù)1#2#3##

          C按層序遍歷樹(shù)得到一棵二叉樹(shù)1#2#3##

          D求二叉樹(shù)的高度得到高度3

          E求葉子結(jié)點(diǎn)個(gè)數(shù)得到個(gè)數(shù)1

          .設(shè)計(jì)概要

          (1)為了實(shí)現(xiàn)上述程序的功能,需要定義二叉樹(shù)的抽象數(shù)據(jù)類型:

          ADT BiTree is{

          數(shù)據(jù)對(duì)象:D={ai|aiIntegerSet,i=0,1,2,…,n,n≥0}
          數(shù)據(jù)關(guān)系:R={<ai,ai+1>|ai,ai+1 D}

          基本操作:

          creat()

          操作結(jié)果:建立一棵二叉樹(shù)

          preorder()

          初始條件:二叉樹(shù)已經(jīng)存在

          操作結(jié)果:先序遍歷顯示二叉樹(shù)

          preordertswap()

          初始條件: 二叉樹(shù)已經(jīng)存在

          操作結(jié)果:交換二叉樹(shù)的左右子樹(shù)

          theight()

          初始條件: 二叉樹(shù)已經(jīng)存在

          操作結(jié)果:輸出二叉樹(shù)的高度

          tleaves()

          初始條件:

          操作結(jié)果:輸出二叉樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù)

          levelorder()

          初始條件: 二叉樹(shù)已經(jīng)存在

          操作結(jié)果:層序遍歷顯示二叉樹(shù)

          }ADT BiTree

          (2) 本程序包含兩個(gè)類和一個(gè)結(jié)構(gòu)體類型

          A基類:隊(duì)列類SeQueue5個(gè)函數(shù)

              1.構(gòu)造函數(shù)                            SeQueue()

              2.析構(gòu)函數(shù)                            ~SeQueue()

              3.進(jìn)隊(duì)函數(shù)                            AddQ(NodeType x)

              4.出隊(duì)函數(shù)                            DelQ()

              5.判斷非空函數(shù)                            IsEmpty()

          B派生類:二叉樹(shù)類BiTree20個(gè)函數(shù)

              1主函數(shù)                                main()

          2. 構(gòu)造函數(shù)                            BiTree()

              3. 析構(gòu)函數(shù)                            ~BiTree()

              4. 建立樹(shù)函數(shù)                            creat0()

              5. 先序遍歷函數(shù)                        void preorder()

              6. 中序遍歷函數(shù)                        inorder()

              7. 后序遍歷函數(shù)                        postorder()

              8.層序遍歷函數(shù)                            levelorder()

              9. 交換左右子樹(shù)函數(shù)                    preordertswap()

              10. 求二叉樹(shù)高度函數(shù)                    theight()

              11. 求二叉樹(shù)葉子結(jié)點(diǎn)個(gè)數(shù)函數(shù)                tleaves()

              12. 建立二叉樹(shù)遞歸算法函數(shù)                *creat()

              13. 先序遍歷遞歸算法函數(shù)                preorder(NodeType *p)

              14. 中序遍歷遞歸算法函數(shù)                inorder(NodeType *p)

              15. 后序遍歷遞歸算法函數(shù)                postorder(NodeType *p)

              16. 按層遍歷算法函數(shù)                    levelorder(NodeType *p)

              17. 先序遍歷方法交換左右子樹(shù)函數(shù)            preorderswap(NodeType *p)

              18. 求二叉樹(shù)高度遞歸算法函數(shù)                height(NodeType *p)

              19. 求二叉樹(shù)葉子結(jié)點(diǎn)個(gè)數(shù)的遞歸算法函數(shù)    leaves(NodeType *p)

              20. 刪除二叉樹(shù)所有結(jié)點(diǎn)函數(shù)                destroy(NodeType* &p)

          C結(jié)構(gòu)體類型NodeType

          (3)本程序的三個(gè)文件

          1.頭文件BiTree.h

          2.源文件     Queue.cpp

                  BiTree.cpp

          (4)函數(shù)之間的關(guān)系

           

           

          .詳細(xì)設(shè)計(jì)

           

            1//BiTree.h
            2//#include <iostream.h>
            3#include <iostream>    // Visual Studio 2008中要求的
            4#include "stdlib.h"
            5#define MAXSIZE 2    
            6typedef int ElemType;
            7using namespace std;    // Visual Studio 2008中要求的
            8
            9struct NodeType                           //定義結(jié)點(diǎn)結(jié)構(gòu)體
           10{       
           11    ElemType   data;                    
           12    NodeType  *lch,*rch;
           13}
          ;
           14
           15//隊(duì)列
           16class SeQueue                                //定義隊(duì)列類SeQueue
           17{  
           18private:
           19       NodeType elem[MAXSIZE];        //存儲(chǔ)隊(duì)列的數(shù)組個(gè)數(shù)
           20        int front,rear;                //隊(duì)頭,隊(duì)尾
           21public:
           22        SeQueue();
           23        ~SeQueue();
           24        void AddQ(NodeType x);        //入隊(duì)函數(shù)
           25        NodeType DelQ();            //出隊(duì)函數(shù)
           26        int IsEmpty()                //判斷隊(duì)列非空函數(shù)
           27        {
           28            return front == rear;
           29        }

           30}
          ;
           31
           32//二叉樹(shù)
           33class BiTree:public SeQueue              //定義二叉樹(shù)類BiTree 作為隊(duì)列類SeQueue的派生類
           34{
           35 public:
           36     BiTree(){    root = NULL;    }                //構(gòu)造函數(shù)
           37     ~BiTree(){    destroy(root);    }        //析構(gòu)函數(shù)
           38     void preorder()                    //先序遍歷
           39     {        preorder(root);        }
           40     void inorder()                          //中序遍歷
           41      {     inorder(root);  }                
           42     void postorder()                     //后序遍歷
           43     {        postorder(root);    }
           44
           45     void preordertswap()                   //交換左右子樹(shù)
           46      {     preorderswap(root);  }
           47     int  theight()                          //求二叉樹(shù)高度
           48      {     return height(root);  }
           49     int tleaves()                         //求二叉樹(shù)葉子結(jié)點(diǎn)個(gè)數(shù)
           50     {        return leaves( root );    }
           51     void levelorder()                       //按層遍歷
           52     {        levelorder(root);    }    
           53      void creat0();                        //建立樹(shù)函數(shù)
           54  private:
           55     NodeType *root;                    //數(shù)據(jù)成員,根結(jié)點(diǎn)
           56     NodeType *creat();                    //建立二叉樹(shù)遞歸算法
           57    void    preorder(NodeType *p);            //先序遍歷遞歸算法
           58     void    inorder(NodeType *p);            //中序遍歷遞歸算法
           59    void    postorder(NodeType *p);            //后序遍歷遞歸算法
           60    void    levelorder(NodeType *p);            //按層遍歷算法
           61     void    preorderswap(NodeType *p);       //利用先序遍歷方法交換左右子樹(shù)
           62     int    height(NodeType *p);            //求二叉樹(shù)高度遞歸算法
           63    int    leaves(NodeType *p);            //求二叉樹(shù)葉子結(jié)點(diǎn)個(gè)數(shù)的遞歸算法
           64     void destroy(NodeType* &p);            //刪除二叉樹(shù)所有結(jié)點(diǎn)
           65}
          ;
           66
           67//BiTree.cpp
           68#include "BiTree.h"
           69
           70void  BiTree::creat0()                         //建立樹(shù)函數(shù),
           71   {  
           72    cout << "請(qǐng)按照樹(shù)的先序遍歷順序組織數(shù)據(jù)" << endl;
           73     cout << "若結(jié)點(diǎn)信息是int,把每個(gè)結(jié)點(diǎn)的空孩子以輸入;" << endl;
           74     cout << "一個(gè)結(jié)點(diǎn)的二叉樹(shù),輸入:0 0;" << endl;
           75     root = creat();          //調(diào)用私有creat()(工具函數(shù));
           76     }

           77NodeType * BiTree::creat()      //遞歸建立二叉樹(shù)算法
           78
           79    NodeType *p;   
           80    ElemType x;
           81    cout << "\n 輸入數(shù)據(jù):"
           82    cin >> x;
           83    if( x == 0 )        //若左或右孩子為空,置當(dāng)前指針這空.
           84        p = NULL;
           85    else {
           86            p = new NodeType; 
           87            p->data = x;
           88            p->lch = creat();                  //遞歸調(diào)用自身
           89            p->rch = creat();
           90          }

           91   return p;
           92}

           93
           94//先序遍歷遞歸算法
           95void BiTree::preorder(NodeType *p)              //先序遍歷顯示
           96{
           97    if( p != NULL)
           98    {
           99        cout << p->data;
          100        preorder( p->lch );        //遞歸調(diào)用自身
          101        preorder( p->rch );        //遞歸調(diào)用自身
          102    }

          103    else
          104        cout <<"#";
          105}

          106//中序遍歷遞歸算法
          107void BiTree::inorder(NodeType *p)     //中序遍歷顯示
          108{  
          109 
          110    if( p != NULL )
          111    {
          112        inorder( p->lch );        //遞歸調(diào)用自身
          113        cout << p->data;
          114        inorder( p->rch );        //遞歸調(diào)用自身
          115    }

          116    else
          117        cout << "#";    
          118
          119}

          120//后序遍歷遞歸算法
          121void BiTree::postorder(NodeType *p)
          122{
          123    if( p != NULL )
          124    {
          125        
          126        postorder( p-> lch );        //遞歸調(diào)用自身
          127        postorder( p-> rch );        //遞歸調(diào)用自身
          128        cout << p->data;
          129    }

          130    else
          131        cout <<"#";
          132}

          133void BiTree::preorderswap(NodeType *p)         //利用先序遍歷方法交換左右子樹(shù)
          134{      
          135    if( p != NULL )
          136    {       
          137        NodeType *r; 
          138        r = p->lch;
          139        p->lch = p->rch; 
          140        p->rch = r;
          141//上面幾條語(yǔ)句可以認(rèn)為對(duì)結(jié)點(diǎn)的訪問(wèn)(交換左右孩子)
          142//替換了原來(lái)的:cout<<p->data<<" ";  語(yǔ)句
          143        preorderswap( p->lch );        //遞歸調(diào)用自身
          144        preorderswap( p->rch );
          145    }

          146}

          147void  BiTree::destroy(NodeType* &p)            //刪除二叉樹(shù)所有結(jié)點(diǎn)
          148{
          149    if(p != NULL)
          150    {    destroy( p->lch );
          151        destroy( p->rch );
          152        delete p;
          153        p = NULL;
          154    }

          155}

          156int BiTree::height(NodeType *p)                //求二叉樹(shù)高度遞歸算法
          157{       
          158    int hl,hr;
          159    if( p != NULL )
          160    {
          161        hl = height( p->lch );
          162        hr = height( p->rch );
          163        return ( hl > hr ? hl : hr ) + 1;        //當(dāng)前結(jié)點(diǎn)高度是以最大的(左右)子樹(shù)的高度加得到
          164        
          165    }

          166    else
          167        return 0;
          168
          169}

          170//求二叉樹(shù)葉子結(jié)點(diǎn)個(gè)數(shù)的遞歸算法
          171int BiTree::leaves(NodeType *p)
          172{
          173    if( p == NULL )            //當(dāng)前結(jié)點(diǎn)是否為空,當(dāng)為空時(shí)就沒(méi)有左右孩子
          174        return 0;
          175    if( ( p-> lch == NULL ) && ( p-> rch == NULL ))    //當(dāng)前結(jié)點(diǎn)是否有左右孩子
          176    {
          177        return 1;
          178    }

          179    return leaves( p-> lch ) + leaves( p-> rch );    //遞歸調(diào)用自身累加葉子結(jié)點(diǎn)個(gè)數(shù)
          180}

          181
          182//按層遍歷算法
          183void BiTree::levelorder(NodeType *p)
          184{
          185    SeQueue q;            //初始化一個(gè)隊(duì)列
          186    NodeType *= p;
          187    if (p)
          188    {
          189        q.AddQ(*p);        //根結(jié)點(diǎn)非空則入隊(duì)
          190    }

          191    while (!q.IsEmpty())
          192    {
          193        t = &(q.DelQ());    //隊(duì)非空則將結(jié)點(diǎn)指針出隊(duì)
          194        cout << t->data;    //并打印輸出結(jié)點(diǎn)的數(shù)據(jù)值
          195        if (t->lch)
          196        {
          197            q.AddQ(*(t->lch));    //存在左孩子則將其進(jìn)隊(duì)
          198        }

          199        else
          200            cout << "#";
          201
          202        if (t->rch)
          203        {
          204            q.AddQ(*(t->rch));    //存在右孩子則將其進(jìn)隊(duì)
          205        }

          206        else
          207            cout << "#";
          208    }

          209}

          210
          211//---------------------------------------------------------------------------
          212int main()
          213
          214  int k;    
          215  BiTree root0;                     //聲明創(chuàng)建二叉樹(shù)對(duì)象,調(diào)用構(gòu)造函數(shù)
          216  do{ cout<<"\n\n";
          217      cout<<"\n\n     1. 建立二叉樹(shù)";
          218      cout<<"\n\n     2. 交換左右子樹(shù)";
          219      cout<<"\n\n     3. 按層序遍歷樹(shù)";  
          220      cout<<"\n\n     4. 求二叉樹(shù)深度 ";
          221      cout<<"\n\n     5. 求葉子結(jié)點(diǎn)個(gè)數(shù)";  
          222      cout<<"\n\n     6. 結(jié)束程序運(yùn)行";
          223      cout<<"\n======================================";
          224      cout<<"\n     請(qǐng)輸入您的選擇(0,1,2,3,4,5,6):"
          225      cin>>k;
          226      switch(k)
          227         {  
          228          case 1:{  
          229                    cout << "\n\t 輸入(0)結(jié)束:";
          230                    root0.creat0();
          231                     cout << "\n\t 先序遍歷結(jié)果:";
          232                    root0.preorder();
          233                    cout << "\n\t 中序遍歷結(jié)果:"
          234                    root0.inorder();
          235                    cout << "\n\t 后序遍歷結(jié)果:"
          236                    root0.postorder();                    
          237                   }
           break;
          238           case 2:{  
          239                    cout <<"\n\t 交換左右子樹(shù)結(jié)果:";
          240                    root0.preordertswap();
          241                    cout << "\n\t 先序遍歷結(jié)果:";
          242                    root0.preorder();             
          243                    cout << "\n\t 中序遍歷結(jié)果:";
          244                    root0.inorder();
          245                    cout << "\n\t 后序遍歷結(jié)果:"
          246                    root0.postorder();    
          247                   }
           break;
          248           case 3:{  
          249                    cout << "\n\t 按層序遍歷結(jié)果:";
          250                    root0.levelorder();    
          251                   }
           break;   
          252           case 4:{  
          253                   int deep;
          254                   deep = root0.theight();
          255                   cout << "\n\t 樹(shù)的深度是:" << deep;
          256                  }
           break;
          257           case 5:{
          258                    int leaf;
          259                    leaf = root0.tleaves();
          260                    cout << "\n\t 樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù)是:" << leaf;
          261                  }
           break;
          262           case 6: exit(0);
          263          }
           //  switch
          264cout<<"\n ----------------";
          265      }
           while(k>=0 && k<6); 
          266   return 0;
          267}
          //-----  
          268
          269//Queue.cpp
          270#include "BiTree.h"
          271SeQueue::SeQueue()        //初始化隊(duì)列
          272{  
          273    front=0;
          274    rear=0;
          275}

          276
          277SeQueue::~SeQueue(){};
          278//進(jìn)隊(duì)
          279void SeQueue::AddQ(NodeType x)    
          280{   
          281    if((rear+1% MAXSIZE==front)
          282         cout<<"QUEUE IS FULL\n";
          283    else
          284    {
          285           rear=(rear+1% MAXSIZE;
          286           elem[rear]=x;        //將結(jié)點(diǎn)指針入隊(duì)
          287    }

          288}

          289
          290//出隊(duì)
          291NodeType SeQueue::DelQ()
          292{        
          293    NodeType q;
          294    NodeType *= NULL;
          295    if(front==rear)
          296    {
          297        return *t;    //返回空指針
          298    }

          299
          300    else
          301    {
          302        front = (front+1% MAXSIZE;
          303        q = elem[front];
          304        return q;        //返回出棧的指針結(jié)點(diǎn)
          305    }

          306

           

          .心得:

              這次實(shí)驗(yàn)不僅能鞏固理解遞歸的方法,另一方面很能考驗(yàn)運(yùn)用指針的能力,還有就是數(shù)據(jù)類型要使用得當(dāng).levelorder(NodeType *p)函數(shù)來(lái)看,首先, DelQ()的返回類型要與BiTree二叉樹(shù)結(jié)點(diǎn)指針的類型一至.其次,在遞歸過(guò)程中,傳入AddQ(NodeType x)是整個(gè)結(jié)點(diǎn)的內(nèi)容而不是一個(gè)指針.值得討論的是,在定義存儲(chǔ)隊(duì)列的數(shù)組時(shí)如何節(jié)省存儲(chǔ)空間?因?yàn)檩斎氲慕Y(jié)點(diǎn)個(gè)數(shù):若為單邊二叉樹(shù)(全只有左結(jié)點(diǎn)或全只有右結(jié)點(diǎn))則為任意個(gè)數(shù)(實(shí)驗(yàn)上這時(shí)只需要兩個(gè)存儲(chǔ)空間);若非單邊二叉則要求結(jié)點(diǎn)最多的層個(gè)數(shù)不得超過(guò)MAXSIZE的值.后者時(shí)MAXSIZE的值(由性質(zhì)2)應(yīng)該為2(h-1) (h為樹(shù)的高度).這一點(diǎn)如何實(shí)現(xiàn)呢?BiTree類是SeQueue類的子類,height()函數(shù)是BiTree類的函數(shù),如果能把高度傳入SeQueue類的構(gòu)造函數(shù)就可以通過(guò)一個(gè)for()語(yǔ)句來(lái)求得一個(gè)合適的值用以初始化MAXSIZE.那么就大大的節(jié)省了內(nèi)存空間,并且還能實(shí)現(xiàn)輸入節(jié)點(diǎn)的個(gè)數(shù)為任意的.但把高度傳入SeQueue類的構(gòu)造函數(shù)如何實(shí)現(xiàn)?還有其他要考慮的問(wèn)題,我在今后的學(xué)習(xí)中深入了解.

          .使用說(shuō)明

              程序名為No4.exe運(yùn)行環(huán)境為DOS,執(zhí)行后顯示:

          " 請(qǐng)輸入您的選擇(0,1,2,3,4,5,6):"后輸入數(shù)字選擇執(zhí)行的功能.

          測(cè)試結(jié)果:

          1)選擇1.后輸入1240003500600.(如右圖的一棵二叉樹(shù))

          2)選擇4

          3)選擇5

          4)選擇2

          5)選擇3

          6)選擇6或輸入非"0,1,2,3,4,5,6"的數(shù)字

          .調(diào)試過(guò)程

              本程序主要對(duì)按層序遍歷操作功能進(jìn)行調(diào)試.Visual Studio 2008演示.首先把BiTree.h中的" #define MAXSIZE 30"改成" #define MAXSIZE 4",目的是從Visual Studio 2008的監(jiān)視(Watch)窗口中得到更好的觀察效果.

          1. 將光標(biāo)移置BiTree.cpp文件的void BiTree::levelorder(NodeType *p)和第一條語(yǔ)句處Ctrl+F10開(kāi)始調(diào)試
          2. 選擇1.后輸入1240003500600.(如右圖的一棵二叉樹(shù))再選擇3.
          3. 這時(shí)Debugger仍停留在void BiTree::levelorder(NodeType *p)的第一條語(yǔ)句上.可以從自動(dòng)監(jiān)視窗口中看到已經(jīng)建立了一棵二叉樹(shù),指針P指向二叉樹(shù)的根結(jié)點(diǎn).

          4. 在監(jiān)視窗口1中輸入變量名:q,t進(jìn)行觀察,F10單步調(diào)試,這時(shí)Debugger停留在    SeQueue q;    語(yǔ)句處

            可以在監(jiān)視1窗口中看到對(duì)象q的指針t都未合法初始化.

          5. 斷續(xù)F10單步調(diào)試兩步,這時(shí)Debugger停留在if(p)語(yǔ)句處,如圖:

            在監(jiān)視1窗口輸入!p進(jìn)行觀察,這時(shí)!p值為0,if(p)判斷語(yǔ)句值為真.

            可以進(jìn)入f(p)執(zhí)行,F10斷續(xù),當(dāng)Debugger停留在q.AddQ(*p)語(yǔ)句時(shí)可以從調(diào)用堆棧窗口中看到現(xiàn)在調(diào)用的函數(shù)為F11步入SeQueue類的AddQ(*p)函數(shù).

          6. 這進(jìn)Debugger停留在AddQ(*p)函數(shù)的第一條語(yǔ)句上.同可以從調(diào)用堆棧窗口中看到現(xiàn)在調(diào)用的函數(shù)為AddQ(*p)

            在監(jiān)視2窗口中輸入rear, elem[rear]進(jìn)行觀察.同時(shí)在自動(dòng)窗口中可以看到變量X已經(jīng)指向二叉樹(shù)的根結(jié)點(diǎn).

             

          7. 斷續(xù)F10真到AddQ(NodeType x)結(jié)束語(yǔ)句處,可以從監(jiān)視2窗口看到根結(jié)點(diǎn)已經(jīng)入隊(duì)

          8. F10后可以看到調(diào)用堆棧窗口中當(dāng)前調(diào)用的是levelorder(NodeType *p)函數(shù),同時(shí)在監(jiān)視1窗口中輸入!q.IsEmpty()觀察到值為true,即可以進(jìn)入while()控制語(yǔ)句執(zhí)行.

            F10單步至    t = &(q.DelQ()),F11步入q.DelQ(),這時(shí)Debugger停留在DelQ()的第一條語(yǔ)句上,可以從調(diào)用堆棧窗口中看到當(dāng)前調(diào)用的是DelQ()函數(shù).

          9. 在監(jiān)視3窗口中輸入q進(jìn)行觀察.斷續(xù)F10Debugger停留在DelQ()函數(shù)的return q語(yǔ)句時(shí)可以從監(jiān)視窗口3中看到根結(jié)點(diǎn)已經(jīng)出隊(duì)

            同時(shí)在自動(dòng)窗口中可以看到從DelQ()函數(shù)返回了出隊(duì)結(jié)點(diǎn)并賦給了指針t

          10. F10單步調(diào)試直到Debugger停留在levelorder(NodeType *p)函數(shù)的cout << t->data語(yǔ)句上,這時(shí)可以在調(diào)用堆棧窗口中看到當(dāng)前調(diào)用的是levelorder(NodeType *p)函數(shù),在監(jiān)視窗口1中輸入t->date進(jìn)行觀察,已經(jīng)取得根結(jié)點(diǎn)數(shù)據(jù)域的值

          11. F10單步調(diào)試一步可以在DOS窗口中看到已經(jīng)輸出根結(jié)點(diǎn)

          12. Shift+F5退出調(diào)試,完成調(diào)試演示.

          評(píng)論

          # re: Visual C++ 6.0調(diào)試功能 圖解教程(3)--實(shí)例二  回復(fù)  更多評(píng)論   

          2008-12-14 23:33 by 小初初
          #include<iostream.h>
          #include<stdio.h>
          #include<malloc.h>
          #define MaxSize 100
          typedef char ElemType;
          typedef struct tnode//定義二叉樹(shù)類型
          {
          ElemType data;
          struct tnode *lchild,*rchild;
          } BTNode;
          void CreateBTree(BTNode * &bt,char *str)//創(chuàng)建二叉樹(shù)
          {
          BTNode *St[MaxSize],*p=NULL;
          int top=-1,k,j=0;
          char ch;
          bt=NULL;
          ch=str[j];
          while (ch!='\0')
          {
          switch(ch)
          {
          case '(':top++;St[top]=p;k=1;break;
          case ')':top--;break;
          case ',':k=2;break;
          default:p=(BTNode *)malloc(sizeof(BTNode));
          p->data=ch;p->lchild=p->rchild=NULL;
          if (bt==NULL)
          bt=p;
          else
          {
          switch(k)
          {
          case 1:St[top]->lchild=p;break;
          case 2:St[top]->rchild=p;break;
          }
          }
          }
          j++;
          ch=str[j];
          }
          }
          void DispBTree(BTNode *bt)//輸出二叉樹(shù)
          {
          if(bt!=NULL)
          {
          cout << bt->data;
          if(bt->lchild!=NULL || bt->rchild!=NULL)
          {
          cout << "(";
          DispBTree(bt->lchild);
          if(bt->rchild!=NULL) cout << ",";
          DispBTree(bt->rchild);
          cout << ")";
          }
          }
          }
          int BTHeight(BTNode *bt)//求二叉樹(shù)的高度
          {
          int lchilddep,rchilddep;
          if (bt==NULL) return(0);
          else
          {
          lchilddep=BTHeight(bt->lchild);
          rchilddep=BTHeight(bt->rchild);
          return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);

          }
          }
          int NodeCount(BTNode *bt)//求二叉樹(shù)的結(jié)點(diǎn)數(shù)
          {
          int num1,num2;
          if(bt==NULL)
          return 0;
          else
          {
          num1=NodeCount(bt->lchild);
          num2=NodeCount(bt->rchild);
          return (num1+num2+1);
          }

          }
          int LeafCount(BTNode *bt)//求二叉樹(shù)的葉子結(jié)點(diǎn)數(shù)
          {
          int num1,num2;
          if(bt==NULL)
          return 0;
          else if (bt->lchild==NULL && bt->rchild==NULL)
          return (1);
          else
          {
          num1=LeafCount(bt->lchild);
          num2=LeafCount(bt->rchild);
          return (num1+num2);
          }
          }
          void PreOrder(BTNode *bt)//先序遍歷
          {
          if (bt!=NULL)
          { cout << bt->data;
          PreOrder(bt->lchild);
          PreOrder(bt->rchild);
          }
          }
          void InOrder(BTNode *bt)//中序遍歷
          {
          if (bt!=NULL)
          {
          InOrder(bt->lchild);
          cout << bt ->data;
          InOrder(bt->rchild);
          }

          }
          void PostOrder(BTNode *bt)//后序遍歷
          { if (bt!=NULL)
          { PostOrder(bt->lchild);
          PostOrder(bt->rchild);
          cout << bt->data;
          }
          }
          void main()//主函數(shù)
          {
          BTNode *b;
          char *str;
          cout <<"輸出括號(hào)表示法的二叉樹(shù)為:"<< endl;
          str="A(B(C(E,F)),D(G))";
          CreateBTree(b,str);
          DispBTree(b);cout << endl;
          cout << "二叉樹(shù)的高為:" << BTHeight(b) << endl;
          cout << "二叉樹(shù)的結(jié)點(diǎn)數(shù)為:" << NodeCount(b) << endl;
          cout << "二叉樹(shù)的葉子結(jié)點(diǎn)數(shù)為:" << LeafCount(b) << endl;
          cout << "二叉樹(shù)的先序遍歷序列:" << PreOrder(b) << endl;
          cout << "二叉樹(shù)的中序遍歷序列:"<< InOrder(b) << endl;
          cout << "二叉樹(shù)的后序遍歷序列:"<< PostOrder(b) << endl;
          }
          有3個(gè)錯(cuò)誤怎么改啊?

          # re: Visual C++ 6.0調(diào)試功能 圖解教程(3)--實(shí)例二  回復(fù)  更多評(píng)論   

          2008-12-15 11:53 by ∪∩BUG
          @小初初
          慢慢調(diào)試吧,以前我也是問(wèn)老師,后來(lái)問(wèn)老師效果不怎么好,我學(xué)習(xí)了調(diào)試就再不用問(wèn)老師了,在調(diào)試中你可以學(xué)到很多東西..
          主站蜘蛛池模板: 柳州市| 麻江县| 衡阳市| 茌平县| 泊头市| 榆树市| 海南省| 罗城| 本溪市| 密山市| 潢川县| 天台县| 乌拉特中旗| 郯城县| 从化市| 昌图县| 桃园县| 永和县| 和政县| 汪清县| 甘德县| 靖江市| 文山县| 卓资县| 苏州市| 永靖县| 双江| 永新县| 横山县| 诸暨市| 连江县| 环江| 星子县| 福州市| 尚志市| 西贡区| 德化县| 繁昌县| 台中县| 岗巴县| 宜昌市|