在學習二分查找樹的時候,在遞歸的問題上遇到不少的問題,在這里和大家分享一下自己的學習過程
我在學習樹的知識的時候,沒有把樹當做一個類,只把一個結點當做一個類。樹的實現都在函數中,如果大家有興趣可以試試在一個類中實現樹
為了方便起見,這不同模板,結點的值用整數型
結點類的設計:
結點類中包含一個表示該節點值的val變量,和指向左結點和指向右結點的指針。這三者構成了一個簡單的結點
1 class Node{ 2 public: 3 int val; 4 Node *left, *right; 5 Node(){right = NULL; left = NULL;} 6 };
建立一棵樹主要通過遞歸來實現
1 Node* build(Node* root, int val){ 2 if(root == NULL){ 3 root = new Node(); 4 root->val = val; 5 return root; 6 } 7 if(val < root->val) root->left = build(root->left, val); 8 else if(val > root->val) root->right = build(root->right, val); 9 return root; 10 }
這里我們用一個函數levelOrder() 來驗證我們的樹是否正確的建立。該函數是按層遍歷樹的結點,輸出每個結點的值。實現過程在后面的博客會詳細的說,現在
直接拿來用就行啦。
1 void levelOrder(Node* root){ 2 queue<Node*> q; 3 q.push(root); 4 while(!q.empty()){ 5 Node *temp = q.front(); 6 q.pop(); 7 cout<<temp->val<<" "; 8 if(temp->left) q.push(temp->left); 9 if(temp->right) q.push(temp->right); 10 } 11 } 12 int main(){ 13 Node *root = NULL; 14 int t[] = {5,4,6,3,7}; 15 for(int i = 0; i < 5; i++) root = build(root, t[i]); 16 levelOrder(root); 17 return 0;}

