数据结构学习之--完全二叉树

寒假学习记录-002

今天来巩固有关二叉树的存储结构,并掌握几种特殊的二叉树。

一、树的几个重要概念及性质

空树(empty tree):树没有结点。
度(degree):结点的子树个数称为结点的度。树中结点最大的度称为树的度(也称为树的宽度)。
叶子结点:度为0的结点。根节点也可以作为叶子结点。
④结点深度(depth):从根结点(深度为1)开始从上至下逐层累加至该结点时的深度值。
⑤结点高度(height):从最底层叶子结点(高度为1)开始从下至上累加至该结点时的高度值。对于一棵树而言,深度与高度是相同的。
森林(forest):多棵树组合在一起称为森林,森林是若干颗树的集合。
数据结构学习之--完全二叉树_第1张图片

二、特殊的二叉树

满二叉树:每一层的结点个数都达到了当曾能达到的最大结点数。
完全二叉树:除了最下面一层外,其余层结点个数都达到了当层能达到的最大结点数,并且最下面一层只从左到右连续存在若干结点。数据结构学习之--完全二叉树_第2张图片

三、二叉树的存储结构

一般来说,二叉树使用链表来定义。

typedef struct Node
{
    int data;
    struct Node *lchild;
    struct Node *rchild;
}Node,*Tree; 

完全二叉树的存储结构:除了用二叉链表的存储结构,可以通过建立一个大小为2n的数组来存放(其中n为完全二叉树的最大高度)。且通过观察可以得出以下规律:

  1. 完全二叉树中任意结点编号为x
  2. 其左儿子编号为2x
  3. 右儿子编号为2x+1
  4. 数组中存放的顺序恰好为该完全二叉树的层序遍历的遍历顺序

四、建立二叉树

新建结点:

Tree newNode(int n)
{
    Tree t = new Tree;
    t->data=n;
    t->lchild=t->rchild=NULL;
    return t;
}

二叉树的创建:

Tree Create(int *a,int n)
{
    Tree root=NULL;//新建空根结点root
    for(int i=0;i<n;i++)
    {
        insert(root,a[i]);//insert函数递归实现
    }
    return root;
}

五、例题(L2-035 完全二叉树的层序遍历 (25 分))

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。
给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。

输入格式:
输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。

输出格式:
在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
8
91 71 2 34 10 15 55 18
输出样例:
18 34 55 71 2 10 15 91

#include 
#include 
#include 
#include 
using namespace std;
int t[32];
int n;
void draw(int a)
{
    if(a>n)
        return;
    draw(a*2);
    draw(a*2+1);
    cin>>t[a];
}

int main()
{
    cin>>n;
    draw(1);
    for(int i=1;i<n;i++)
        cout<<t[i]<<" ";
    cout<<t[n]<<endl;
    return 0;
}

今日的学习分享就到这啦!如果你觉得我的分享有给你一些帮助,不妨给我点个赞( •̀ ω •́ )✧!

你可能感兴趣的:(数据结构学习,二叉树,数据结构,链表)