我們有一個數組,該數組按照層次遍歷來保存二叉樹的結點
若數組爲:
int treeNodeValue[]={5,3,7,2,4,6}
對應的二叉樹爲:
以下代碼對這個數組進行交換:
從第二個結點開始遍歷,若比它父親大,繼續遍歷
若比它父親小,用父親的覆蓋當前位置,接着與父親的父親比較...最後把這個點插入,作爲比它本身小的祖先的子結點。
代碼實現如下:
#include<iostream> struct TreeNode{ int value; TreeNode* lChild; TreeNode* rChild; }; TreeNode* buildTree(int tnv[],int nodeNumber){ TreeNode* nodes[nodeNumber]; for(int i=0; i<nodeNumber; i++){ nodes[i] = new TreeNode; nodes[i]->value = tnv[i]; nodes[i]->lChild = NULL; nodes[i]->rChild = NULL; } //connect all the nodes int lChildIndex=0,rChildIndex=0; for(int i=0; i<nodeNumber; i++){ //left child connect lChildIndex =2*i + 1; if(lChildIndex < nodeNumber) nodes[i]->lChild = nodes[lChildIndex]; rChildIndex = 2*i + 2; if(rChildIndex < nodeNumber) nodes[i]->rChild = nodes[rChildIndex]; } return nodes[0]; } void buildSmallHeap(int tnv[], int len){ int currentIndex,parentIndex,store; for(int i=1; i<len; i++){ currentIndex = i; store = tnv[currentIndex]; parentIndex = (i-1)/2; if(tnv[currentIndex] >= tnv[parentIndex]) continue; while(parentIndex >=0 ){ if(tnv[parentIndex] > store){ std::cout<<"god"; tnv[currentIndex] = tnv[parentIndex]; currentIndex = parentIndex; if(currentIndex == 0) break; parentIndex = (parentIndex - 1)/2; }else break; } tnv[currentIndex] = store; } } int main(){ int treeNodeValue[]={5,3,7,2,4,6}; int treeNodeNumbers = sizeof(treeNodeValue)/sizeof(int); buildSmallHeap(treeNodeValue,treeNodeNumbers); TreeNode* root; root = buildTree(treeNodeValue,treeNodeNumbers); //root and his children std::cout<<"root: "<<root->value<<std::endl; std::cout<<"lChild: "<<root->lChild->value<<std::endl; std::cout<<"rChild: "<<root->rChild->value<<std::endl; //root's left child and his children std::cout<<"root: "<<root->lChild->value<<std::endl; std::cout<<"lChild: "<<root->lChild->lChild->value<<std::endl; std::cout<<"rChild: "<<root->lChild->rChild->value<<std::endl; //root's right child and his children std::cout<<"root: "<<root->rChild->value<<std::endl; std::cout<<"lChild: "<<root->rChild->lChild->value<<std::endl; std::cout<<"rChild: "<<root->rChild->rChild->value<<std::endl; return 0; }
最後得到滿足最小堆的一棵樹:
其中,程序的運行結果爲:
其中的segmentation fault 是因爲最後一個非葉子結點沒有右孩子導致的內存訪問出錯。