C++類模板實踐(二叉樹類)1
阿新 • • 發佈:2018-12-20
先貼上我程式碼(未成品,我就先寫了構造和析構,先序遍歷程式碼),需要用的人可以直接用。
造輪子方便我去了解STL,瞭解程式碼。
我寫程式碼時踩過的一些小坑,作為一些小知識:
發生了幾個語法,編譯,連結bug。
第一個:模板的typedef,得宣告型別:typedef BinaryTreeNode<T> Node;
第二個:struct BInaryTreeNode,構造時採用匿名物件構造解決了初版程式碼的一些小問題
第三個:inline函式還是不要分離(我自己一開始不規範),一開始宣告放在標頭檔案,實現放在下面的cpp實現,會出現連結錯誤,源自inline的特性:C++在編譯inline(內聯)函式時,會直接展開,避免壓棧,宣告實現分離就會....找不到函數了。
第四個:stack容器得把型別定好,我實現先序遍歷的迭代版本(非遞迴)時,一開始沒使用stack<BinaryTreeNode<T>* >,導致了一些stack型別轉換問題,恩,沒錯,借鑑我程式碼的朋友要時刻注意模板型別的問題,模板還是蠻酸爽的,和用C語言寫資料結構完全不一樣。
#pragma once #include <iostream> #include <stack> #include<queue> using namespace std; template <typename T> struct BinaryTreeNode { BinaryTreeNode(T data = T()) :_left(nullptr) , _right(nullptr) , _data(data) {} BinaryTreeNode* _left; BinaryTreeNode* _right; T _data; }; template <typename T> class BinaryTree { typedef BinaryTreeNode<T> Node; public: BinaryTree(const T* a, size_t size, int index, const T& invalid);//構造 ~BinaryTree();//析構 void PrintPre(); void PrintPreIteration(); private: Node* _MakeTree(const T* a, size_t size, int& index, const T& invalid); void Destroy(Node* _root); void _PrintPre(Node* _root); private: Node* _root; }; template<typename T> inline BinaryTree<T>::BinaryTree(const T* a, size_t size, int index, const T& invalid) { _root = _MakeTree(a, size, index, invalid); } template<typename T> inline BinaryTree<T>::~BinaryTree() { Destroy(_root); } template<typename T> inline void BinaryTree<T>::PrintPre() { _PrintPre(_root); } template<typename T> inline BinaryTreeNode<T> * BinaryTree<T>::_MakeTree(const T * a, size_t size, int & index, const T & invalid) { Node *root = nullptr; if (index < size && a[index] != invalid) { root = new Node(invalid); root->_data = a[index]; root->_left = _MakeTree(a, size, ++index, invalid); root->_right = _MakeTree(a, size, ++index, invalid); } return root; } template<typename T> inline void BinaryTree<T>::Destroy(Node * _root) { Node* tmp = _root; if (tmp == nullptr) return; Destroy(tmp->_left); Destroy(tmp->_right); delete tmp; tmp = nullptr; } template<typename T> inline void BinaryTree<T>::_PrintPre(Node * _root) { if (_root==nullptr) { return; } cout << _root->_data << endl; _PrintPre(_root->_left); _PrintPre(_root->_right); } template<typename T> inline void BinaryTree<T>:: PrintPreIteration() { Node* cur =_root;//BinaryTreeNode<T> Node* top =nullptr; stack<Node*> s; if(cur==nullptr) { return; } while(cur||!s.empty()) { while(cur) { s.push(cur); cout<<cur->_data<<endl; cur=cur->_left; } top=s.top(); s.pop(); cur=top->_right; } }
,