1. 程式人生 > >[C++11] 順序儲存的完全二叉樹構造樹形結構

[C++11] 順序儲存的完全二叉樹構造樹形結構

     我們知道,二叉樹有兩種基本的儲存方式:順序儲存方式和樹形儲存方式。在用程式碼實現之前,我們先來分析一下我們的思路:

     (1)分析

               假定我們採用如下結構來順序儲存一棵二叉樹。

              不難看出seq是一個動態陣列vector,其中的每一個元素都是一個指向type型別的指標(type*)

                        

            對於上面例子中的二叉樹,等價於如下表示的樹形結構

                                                                     

               我們能夠很容易的發現兩者之間的對應關係:1、seq表示的序列就是二叉樹層序遍歷的結果;2、設seq的最大下標為n,則n==seq.size()-1。3、假設某一結點下標為 i ,則其左子女的下標為 2*i+1,右子女的下標為2*i+2

          (2)建構函式的程式碼實現

    binaryTree(const vector<shared_ptr<type>> seq)
    {
        vector<shared_ptr<treeNode<type>>> vec(seq.size());

        for(unsigned int i=0;i<seq.size();i++)      //第一層迴圈實現了type*向treeNode*的轉換
        {
            if(seq[i]==nullptr)
                vec[i]=nullptr;
            else
            {
                vec[i]=shared_ptr<treeNode<type>>(new treeNode<type>(*seq[i]));
            }
        }

        for(unsigned int i=0;i<vec.size();i++)
        {
            if(vec[i]!=nullptr)     //此處判空很關鍵
            {
                if(2*i+1<vec.size())
                    vec[i]->LeftChild=vec[2*i+1];
                if(2*i+2<vec.size())
                    vec[i]->RightChild=vec[2*i+2];
            }
        }
        _root=vec[0];
    }