C++二叉树

本文介绍了二叉树的基本概念,包括空树、单节点树、左偏树、右偏树及完全二叉树的特性。详细阐述了满二叉树与完全二叉树的区别,并提供了完全二叉树的顺序存储实现,包括查找、添加、初始化、获取子节点值等操作。此外,还讨论了二叉树的三种遍历方式:先序、中序和后序遍历。代码实现采用C++模板类,支持动态扩容。
摘要由CSDN通过智能技术生成

目录

二叉树

特性

满二叉树

*完全二叉树

完全二叉树的框架

完全二叉树的遍历

二叉树

二叉树是每个节点最多有两个子树的有序树(度<=2)

表现形式

1.空树

2.丘(只有根节点)

3.乒(只有左子树)

4.乓(只有右子树)

5.兵(既有左子树又有右子树)

特性

1.二叉树的每个节点最多只有两颗子树

2.二叉树的子树有左右之分,次序不可颠倒

3.二叉树的第i层至多有2的i-1次方个节点

4.深度为K的二叉树至多有2^(k)-1个节点

5.任意一颗二叉树,度为2的节点数为n,度为0的节点数为m,m=n+1

满二叉树

二叉树中第i层的节点数必须为2的i次方个结点

二叉树如果高度为K,则这个二叉树的节点数必须为2的(k+1)次方-1个

满二叉树不存在度为1的节点,每一个分支节点都有两颗高度一致的二叉树

*完全二叉树

满二叉树是完全二叉树,完全二叉树不一定是满二叉树

下标规律

实现 顺序+非线性

完全二叉树的框架

template <typename T>
class CMYTree_arr
{
private:
	T *pBuff; //数据域
	size_t len; //数据量
	size_t MAXSize; //最大空间
public :
	CMYTree_arr();
	~CMYTree_arr();
public:
	void clear(); //清除函数
	bool find(T const& findVal) const;//查找
	void appEndNode(T const& data); //添加
	void initTreeArr(T arr[], int Length);//用数组初始化
	T GetParentVal(int const & index)const;//查找父节点
	///查找左右子树
	T GetLChildVal(int const& index)const;//查找左子树
	T GetRChildVal(int const& index)const;//查找右子树
	void PrintTree();//遍历树
private:
	void _PrintTree(int ArrIndex);//遍历递归
	int _find(T const& findVal)const; //内部函数
};

实现

template <typename T>
T  CMYTree_arr<T>::GetParentVal(int const & index)const//查找父节点
{
	if (pBuff == nullptr)
	{
		throw"内容为空";
	}
	if ((index - 1)<0 || (index - 1)>(len - 1))
	{
		throw"访问越界";
	}
	return pBuff[((index - 1) - 1) >> 1];
}
template <typename T>
void CMYTree_arr<T>::initTreeArr(T arr[], int Length)//用数组初始化
{
	//初始化前先清空数组
	clear();
	if (Length > 0)
	{
		MAXSize = len = Length;
		pBuff = new T[Length];
		for (size_t i = 0; i < len; i++)
		{
			pBuff[i] = arr[i];
		}
	}
}
template <typename T>
void  CMYTree_arr<T>::appEndNode(T const& data)//添加
{
	//扩容
	if (len >= MAXSize)
	{
		MAXSize += (MAXSize >> 1) > 1 ? (MAXSize >> 1) : 1;
		T *pTemp = new T[MAXSize];
		for (size_t i = 0; i < len; i++)
		{
			pTemp[i] = pBuff[i];
		}
		if (pBuff)
			delete[] pBuff;
		pBuff = pTemp;
	}
	//扩容完成
	pBuff[len++] = data;
}
template <typename T>
int CMYTree_arr<T>::_find(T const& findVal)const
{
	for (size_t i = 0; i < len; i++)//层次遍历
	{
		if (pBuff[i] == findVal)
			return i;
	}
	return -1;
}

template <typename T>
bool CMYTree_arr<T>::find(T const& findVal) const
{
	return _find(findVal) != -1;
}

template <typename T>
void CMYTree_arr<T>::clear()
{
	if (pBuff)
		delete[] pBuff;
	pBuff = nullptr;
	len = MAXSize = 0;

}

template <typename T>
CMYTree_arr<T>::~CMYTree_arr()
{
	clear();
}

template <typename T>
CMYTree_arr<T>::CMYTree_arr()
{
	pBuff = nullptr;
	len = MAXSize = 0;
}

完全二叉树的遍历

1).先序(根左右)

2).中序(左根右)

3).后序(左右根)

template <typename T>
void CMYTree_arr<T>::_PrintTree(int ArrIndex)//遍历树递归
{
	if (ArrIndex<(int)len&&ArrIndex>-1)
	{
		_PrintTree(2 * ArrIndex + 1);//遍历左子树
		_PrintTree(2 * ArrIndex + 2);//遍历右子树
		cout << pBuff[ArrIndex] << '\t';//访问根节点
	}
}
template <typename T>
void CMYTree_arr<T>::PrintTree()//遍历树
{
	return _PrintTree(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值