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;
	}
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值