完全二叉树(详细代码)

一、二叉树

是每个结点最多有两个子树的有序树,是树的一种。

二叉树的特性:

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
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
int TreeArr::_find(T const & findData) const
{
    for (int i = 0; i < len; i++)
    {
        if (pBuff[i] == findData)
        {
            return i;
        }
    }
    return -1;
}

4. 内部输出函数

template
void TreeArr::_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
bool TreeArr::find(T const & findData) const
{
    return _find(findData) != -1;
}

6. 输出函数

template
void TreeArr::printfTree()
{
    _printfTree(0);
}

7. 构造二叉树函数

template
void TreeArr::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
void TreeArr::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
void TreeArr::clear()
{
    if (pBuff)
    {
        delete [] pBuff;
    }
    pBuff = nullptr;
    len = Maxsize = 0;
}

10.构造析构函数

template
TreeArr::TreeArr()
{
    pBuff = nullptr;
    len = Maxsize = 0;
}
template
TreeArr::~TreeArr()
{
    clear();
}

你可能感兴趣的:(数据结构,c++)