先贴上我代码(未成品,我就先写了构造和析构,先序遍历代码),需要用的人可以直接用。
造轮子方便我去了解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;
}
}
,