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

            天之道

            享受編程的樂趣。
            posts - 118, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            二叉樹之數組存儲

            Posted on 2012-10-16 23:47 hoshelly 閱讀(1569) 評論(0)  編輯 收藏 引用 所屬分類: ProgrammingDS && Algorithm
            二叉樹可以采用數組的方法進行存儲,把數組中的數據依次自上而下,自左至右存儲到二叉樹結點中,一般二叉樹與完全二叉樹對比,比完全二叉樹缺少的結點就在數組中用0來表示

            結點存儲的數據均為非負整數

            Input

            第一行輸入一個整數t,表示有t個二叉樹

            第二行起,每行輸入一個數組,先輸入數組長度,再輸入數組內數據,每個數據之間用空格隔開,輸入的數據都是非負整數

            連續輸入t行

            Output

            每行輸出一個示例的先序遍歷結果,每個結點之間用空格隔開

            Sample Input

            3
            3 1 2 3
            5 1 2 3 0 4
            13 1 2 3 4 0 5 6 7 8 0 0 9 10
            Sample Output

            1 2 3 
            1 2 4 3 
            1 2 4 7 8 3 5 9 10 6 

            分析:
            這道題的關鍵在于:設定數組位置從1開始編號,那么位置為i的結點,它的左孩子在數組的位置是2i,右孩子在數組的位置是2i+1

            這道題的難點在把樹建立起來,其他都容易。

            代碼:

            #include <iostream> 
            using namespace std;

            class BiTreeNode
            {

            private:

             BiTreeNode  *leftChild;      //左子樹指針

             BiTreeNode  *rightChild;      //右子樹指針

            public:

             int  data;           //數據域


             
            //構造函數和析構函數

             BiTreeNode():leftChild(NULL), rightChild(NULL){}

             BiTreeNode(int  item, BiTreeNode  *left = NULL, 

                BiTreeNode  *right = NULL):

                data(item), leftChild(left), rightChild(right){}

             ~BiTreeNode(){}


             BiTreeNode  * &Left(void//注意返回值類型為指針的引用類型

              {return leftChild;}

             BiTreeNode  * &Right(void//注意返回值類型為指針的引用類型

              {return rightChild;}

            };




            class BiTree

            {

            private:

             BiTreeNode  *root;       //根結點指針

                int i,len; //len是樹結點的數量

             void Destroy(BiTreeNode  * &t);

             void PreOrder(BiTreeNode  * &t);

             void  CreateBiTree(BiTreeNode * &T,const int arrTree[],int pos);

            public:

             //構造函數和析構函數

             BiTree(void):root(NULL),i(0){};     //構造函數

             ~BiTree(void){};        //析構函數


             
            //構造二叉樹

               void MakeTree(const int arrTree[],int num); //構造二叉樹,利用先序遍歷結果建樹

               void Destroy(void);        //銷毀二叉樹


             void PreOrder();  //前序遍歷 

            };


            //2、定義銷毀函數

            void BiTree ::Destroy(void)       //銷毀二叉樹,公有函數

            {

             Destroy(root);

            }


            void BiTree ::Destroy(BiTreeNode  * &t)             

            //銷毀二叉樹,私有函數供共有函數調用

            {

             if(t != NULL && t->Left() != NULL)

              Destroy(t->Left());


             if(t != NULL && t->Right() != NULL)

              Destroy(t->Right());


             if(t != NULL)

             {
              delete t;
             }

            }


            //3、定義建樹函數

            void BiTree::MakeTree(const int arrTree[],int num)

            //構造二叉樹,利用先序遍歷結果建樹,公有函數

            {

               i=0;
               len = num;

               CreateBiTree(root,arrTree,1);//數組位置從1開始

            }


            void BiTree::CreateBiTree(BiTreeNode * &T, const int arrTree[],int pos)   //遞歸建樹私有函數

            {

             int ch;

             ch=arrTree[pos]; 

             if (ch == 0 || pos > len) T = NULL;

             else 

             {

              T=new BiTreeNode();

              T->data = ch;              // 生成根結點
              i++;
              if(i>len) return;

              CreateBiTree(T->Left(), arrTree,2*pos);   // 構造左子樹

              CreateBiTree(T->Right(), arrTree,2*pos+1);   // 構造右子樹

               } 

            }

            //4、定義先序遍歷函數

            void BiTree::PreOrder()

            //前序遍歷訪問二叉樹,公有函數

            {

             PreOrder(root);

            }


            void BiTree::PreOrder(BiTreeNode* &t)

            //前序遍歷訪問二叉樹,私有函數t

            {


              if(t!=NULL)//若二叉樹結點不為空,執行如下操作:
              {
                  cout<<t->data<<" ";//1、輸出當前結點的數據,表示該結點被訪問了

                  PreOrder(t->Left());//2、先序遍歷該結點的左孩子

                  PreOrder(t->Right());//3、先序遍歷該結點的右孩子
              }


            }

            int main()
            {
                int m,i,j,k;
                int *arrTree;
                BiTree myTree;
                cin>>m;
                for(i=0;i<m;i++)
                {
                    arrTree = new int[800];
                    cin>>k;
                    for(j=1;j<=k;j++)
                        cin>>arrTree[j];
                    myTree.MakeTree(arrTree,k);
                    myTree.PreOrder();
                    cout<<endl;
                    
                    delete []arrTree;
                    myTree.Destroy();
                }
                return 0;
            }
            亚洲欧美精品一区久久中文字幕 | 99久久精品免费看国产一区二区三区 | 久久亚洲精品无码AV红樱桃| 狠狠人妻久久久久久综合蜜桃| 国产精品gz久久久| 91精品国产综合久久四虎久久无码一级 | 国产精品久久亚洲不卡动漫| 99久久99这里只有免费的精品| 久久美女网站免费| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 天天爽天天狠久久久综合麻豆| 色偷偷88888欧美精品久久久| 青草影院天堂男人久久| 久久久亚洲裙底偷窥综合| 国产精品一区二区久久精品| 99久久这里只精品国产免费| 99国产精品久久| 91精品免费久久久久久久久| 国产精品热久久无码av| 久久99精品国产| 天堂无码久久综合东京热| 国产精品久久久久久久午夜片 | 久久只这里是精品66| 亚洲va久久久久| av无码久久久久不卡免费网站| 欧美精品一本久久男人的天堂| 国产农村妇女毛片精品久久| 久久精品国产99久久久| 中文字幕久久精品无码| 少妇久久久久久久久久| 国产精品久久久久久影院| 国产V综合V亚洲欧美久久| 91精品国产综合久久久久久| 丁香狠狠色婷婷久久综合| 亚洲综合久久综合激情久久| 国产高清国内精品福利99久久| 久久精品国产只有精品66| 久久天天躁狠狠躁夜夜2020一 | 欧美亚洲国产精品久久久久| 亚洲欧美成人综合久久久| 国产高清美女一级a毛片久久w|