簡單二叉樹的實現

相對其它的數據結構,樹顯然更復雜,主要是因爲涉及到大量的指針操作。

剛開始,腦子裏都是樹的遞歸定義,越想越懵了,無從下手。於是從最簡單,最

容易想到的地方下手,來實現一顆簡單的二叉樹。

我們的目標是下圖這顆樹:
















解決思路:

1. 借用一個數組來記錄樹的節點的值,數組爲該樹以廣度優先遍歷形成的。

2. 生成一個指針數組來存貯各個節點的地址

3.根據數組中的前後關係可以建立父親與孩子的關係


源代碼:

#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];
}

int main(){
        int treeNodeValue[]={5,3,7,2,4,6};
        int treeNodeNumbers = sizeof(treeNodeValue)/sizeof(int);
        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;
}

運行的結構如下圖:



注:最後一組,節點7的沒有右孩子,而程序沒有相應的出錯處理,所有提示“Segmentation fault”

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