簡單構建最小堆

我們有一個數組,該數組按照層次遍歷來保存二叉樹的結點

若數組爲:

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 是因爲最後一個非葉子結點沒有右孩子導致的內存訪問出錯。

發佈了45 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章