相對其它的數據結構,樹顯然更復雜,主要是因爲涉及到大量的指針操作。
剛開始,腦子裏都是樹的遞歸定義,越想越懵了,無從下手。於是從最簡單,最
容易想到的地方下手,來實現一顆簡單的二叉樹。
我們的目標是下圖這顆樹:
解決思路:
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”