[C++11] 順序儲存的完全二叉樹構造樹形結構
阿新 • • 發佈:2019-02-20
我們知道,二叉樹有兩種基本的儲存方式:順序儲存方式和樹形儲存方式。在用程式碼實現之前,我們先來分析一下我們的思路:
(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]; }