一、二叉树
是每个结点最多有两个子树的有序树,是树的一种。
二叉树的特性:
1. 子树有左右之分,次序不能颠倒
2. 第i层最多有2^(i-1)个节点
3. 深度为k的二叉树至多有2^(k)-1个节点
4. 如果度为2的节点数为n,度为0的节点数为m,则m = n + 1
二、满二叉树
是二叉树的一种特殊的情况
满二叉树的特性:
1. 第i层上的节点数必须为2^i个节点
2. 高度为k,节点数必须为2^(k+1)-1个节点
3. 有可能空间浪费太大
三、完全二叉树
也是二叉树的一种特殊情况
满二叉树是完全二叉树,完全二叉树不一定是满二叉树
完全二叉树的特性:
1. 根节点下标默认为0
2. 任意节点下标为i,则其父节点下标为(i -1)>>1
3. 任意节点下标为i,则其左子树下标为2*i + 1 ,右子树下标为2*i + 2
四、代码示例(完全二叉树)
1. 二叉树结构
template<typename T>
class TreeArr
{
T *pBuff;//数组实现完全二叉树
T len;//长度
T Maxsize;//最大容量
}
2. 基本函数
public:
TreeArr();//构造函数
~TreeArr();//析构函数
void clear();//清空二叉树
void InitTree(T arr [],int lenght);//构造二叉树
void append(T const & data);//尾部插入
bool find(T const & findData) const;//查找函数
void printfTree();//输出二叉树
private:
int _find(T const & findData) const;//内部查找函数
void _printfTree(int Index);//内部输出函数
3. 内部查找函数
template<typename T>
int TreeArr<T>::_find(T const & findData) const
{
for (int i = 0; i < len; i++)
{
if (pBuff[i] == findData)
{
return i;
}
}
return -1;
}
4. 内部输出函数
template<typename T>
void TreeArr<T>::_printfTree(int Index)
{
// if (Index<0 || Index>=len)
// {
// return;
// }
if (Index < len)
{
printf("%d\n",pBuff[Index]);//先序
_printfTree(Index*2 + 1);
// printf("%d\n",pBuff[Index]);//中序
_printfTree(Index*2 + 2);
// printf("%d\n",pBuff[Index]);//后序
}
}
5. 查找函数
template<typename T>
bool TreeArr<T>::find(T const & findData) const
{
return _find(findData) != -1;
}
6. 输出函数
template<typename T>
void TreeArr<T>::printfTree()
{
_printfTree(0);
}
7. 构造二叉树函数
template<typename T>
void TreeArr<T>::InitTree(T arr [],int lenght)
{
clear();//必须先清除
if (lenght > 0)
{
Maxsize = len = lenght;
pBuff = new T [Maxsize];
for (int i = 0; i < len; i++)
{
pBuff[i] = arr[i];
}
}
}
8. 尾部插入函数
template<typename T>
void TreeArr<T>::append(T const & data)
{
if (len >= Maxsize)
{
Maxsize += ((Maxsize>>1 > 1) ? Maxsize>>1 : 1);
T *tempBuff = new T[Maxsize];//动态开辟辅助数组
for (int i = 0; i < len; i++)
{
tempBuff[i] = pBuff[i];
}
if (pBuff)
{
delete[] pBuff;//清空原数组
}
pBuff = tempBuff;//把辅助数组拷贝到原数组
}
pBuff[++len] = data;//尾部插入
}
9. 清空二叉树函数
template<typename T>
void TreeArr<T>::clear()
{
if (pBuff)
{
delete [] pBuff;
}
pBuff = nullptr;
len = Maxsize = 0;
}
10.构造析构函数
template<typename T>
TreeArr<T>::TreeArr()
{
pBuff = nullptr;
len = Maxsize = 0;
}
template<typename T>
TreeArr<T>::~TreeArr()
{
clear();
}