1. 程式人生 > >C++類模板實踐(二叉樹類)1

C++類模板實踐(二叉樹類)1

先貼上我程式碼(未成品,我就先寫了構造和析構,先序遍歷程式碼),需要用的人可以直接用。

造輪子方便我去了解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;
	}
}