算法與數據結構(一)將一個數組中的各節點按照層次遍歷插入構成完全二叉樹


按層次構建完全二叉樹

(本人入門水平,這是我的第一篇博客,希望通過寫寫博客能增強自己的理解,同時也能給大家提供一些力所能及的幫助,通過這個平台共同進步,有錯誤的地方希望各位大佬指出來,我會努力改正的,謝謝大家!)

1.主要思想:

        由於是層次遍歷,必須保證一行(也就是一層)構建完成才能繼續添加下一層的節點,這就使對於樹的來講,操作比較方便的“遞歸算法”會在這個問題上操作困難。

為了達到按照層次遍歷的需求,我們需要另外尋求方法,那就是用迭代(也就是循環)。

       從根節點開始循環,每次創建兩個結點,分別作父親節點的左孩子和右孩子,通過(層數-1)(log2[節點數]來確定)來控制循環次數,並通過條件判斷來防止超出節點個數。

2.代碼部分:

 1 typedef int Elementtype;    //    定義數據類型,可根據需要自行定制
 2 typedef struct TreeNode * Node;    //    Node相當於struct treeNode *
 3 //    定義數節點結構
 4 typedef struct TreeNode {
 5  Elementtype value; 6 Node left; // 樹節點的左子節點 7 Node right; // 樹節點的右子節點 8 }TREE,*PTREE; 9 10 11 //初始化 12 void initBtree(PTREE &bTree){ 13 bTree= new TREE; 14 bTree->left=NULL; 15 bTree->right=NULL; 16 bTree->value=0; 17 } 18 19 20 21 // 層次遍歷構造完全二叉樹定義 22 void bTreetobTree(PTREE bTree1,int *val,int length) {//數組和數組的長度 23 PTREE p = bTree1; 24 PTREE q = bTree1; 25 for(int i=length;i>=0;i--){ 26 val[i+1]=val[i]; 27  } 28 length++; 29 val[0]=0; 30 int m=log2(length); 31 int max= pow(2,m)-1; 32 for(int i=0;i<max;i++){ 33 p->value = val[i]; 34 if(length>2*i+1){ 35 PTREE pArr2 = (PTREE)malloc(sizeof(TREE)); 36 p->left = pArr2; 37 p->left->value = val[2*i+1]; 38 p->left->left=NULL; 39 p->left->right=NULL; 40  } 41 if(length>2*i+2){ 42 PTREE pArr3 = (PTREE)malloc(sizeof(TREE)); 43 p->right = pArr3; 44 p->right->value = val[2*i+2]; 45 p->right->left=NULL; 46 p->right->right=NULL; 47  } 48 if(i%2==0){ 49 q=p; 50 p=p->left; 51  } 52 else{ 53 p=q->right; 54  } 55  } 56 printf("\n*************************************************************************************\n"); 57 printf("\n最終得到的完全二叉樹經過中序輸出為:\n"); 58  InOrderTree(bTree1); 59 }

主函數就不寫了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM