数据结构与算法-树和二叉树

32 阅读1分钟

导图

b199782a6d3bb67a46d187912bddc711.png

完全二叉树:从上到下,从左到右

一、二叉树的性质

image.png

image.png

性质推导

  1. 第一层1个,第二层2个,...,第i层2^(i-1)个

  2. 假设为满二叉树(即结点最多的情况),则总结点数为1+2^1+2^2+...+2^(k-1)个,首项为1,比值为2,共k项 等比数列求和得1*[(1-2^k)/(1-2)]=2^k-1

image.png

  1. 对于任意一棵二叉树,叶子结点的数量n0等于度为 2 的结点数量n2加 1,即 n0=n2+1
  • n0:二叉树中叶子结点的数量(叶子结点是 “度为 0” 的结点,即没有子结点的结点);
  • n2:二叉树中度为 2的结点数量(度为 2 表示该结点有 2 个子结点:左孩子 + 右孩子)。

image.png

4.向下取整再加1

image.png

image.png

image.png

习题

image.png

二、二叉树的遍历

类型

先序、中序、后序(看根节点的顺序)

image.png

1、先序遍历算法

void PreOrder(BiTree T){
    if(T==NULL){ return; }
    cout<<T->data;//先访问根节点
    PreOrder(T.lchild);//再递归访问左子树
    PreOrder(T.rchild);//最后递归访问右子树
}

其他调换cout<data;的位置即可

2、计算叶子结点个数

int leafCount(BiTree T){
    if(T==NULL) return 0;//如果是空树返回0
    if(T->lchild==NULL&&T->rchild==NULL){//遇到叶子结点加1
    return 1;
    }
    return leafCount(T->lchild)+leafCount(T->rchild);
}

3、二叉树遍历算法的应用

image.png

三、哈夫曼树(带权路径长度最短的二叉树)及其编码

贪心算法——>每次选取两个最小的进行合并——>得到最小带权路径 哈夫曼树的构造不一定是唯一的

image.png

四、恢复二叉树以及二叉树与树、森林的转换

image.png