二叉树学习笔记(一)

二叉树的定义与基本操作

  1. 定义
    把满足以下两个条件的树结构称为二叉树
    1):每个节点的度都不大于2。
    2):每个节点的孩子结点次序不能颠倒。

  2. 二叉树的性质

    1. 在二叉树的第i层上至多有2^(i-1)个节点。
    2. 深度为k的二叉树,其节点总数的最大值是将每层上的结点的最大值相加,所以深度为k的二叉树的结点总数至多为
      这里写图片描述
    3. 对任意一课二叉树T,若是终端结点数为n0,而其读书为2的结点数为n2,则n0=n2+1。
      证明:设二叉树中结点总数为n,n1为二叉树中度为1的结点总数
      因为二叉树中所有节点的度小于等于2,所以有n=n0+n1+n2,设二叉树中分支数目为B,因为除根节点以外,每个节点均对应一个进入它的分支,所以有n=B+1
      同时所有的分支均由度为1和度为2的节点产生,故B=2*n2+n1,故n=n1+n2*2+1=n0+n1+n2
      由上可知n0=n2+1
满二叉树:深度为k,且有2^k-1个节点的二叉树,在满二叉树中,每一层节点都是满的。
满二叉树的顺序表示:从二叉树的根节点开始,按照层间从上到下,从左到右顺序进行编号。
完全二叉树:深度为k,节点数为n的二叉树,如果其节点1-n的位置序号分别于满二叉树的结点1-n的位置序号一一对应,
则为完全二叉树。
可见满二叉树是完全二叉树而完全二叉树不一定是满二叉树
        4. 具有n个节点的完全二叉树的深度为log2(n)+1(向下取整)
        5. 对于具有n个节点的完全二叉树,如果按照从上到下和从左到右的顺序对二叉树中的所有节点开始按照顺序标号,则对
        任意的序号为i的结点有:
         a:如i=1,则序号为i的结点是根节点,无双亲结点;如i>1,则序号为i的结点序号为i/2,向下取整。
         b:如2*i>n,则序号为i的结点无左孩子,如2*1<=n,则序号为i的结点的左孩子结点的序号为2*i
         c:如果2*i>n,则序号为i的结点无右孩子结点,如2*i+1<=n,则序号为i的结点的右孩子结点的序号为2*i+1

3 二叉树的存储
二叉树的结构式非线性的,每一个节点最多可以有两个后继。二叉树的存储结构有两种存储结构:顺序存储结构和链式存储结构。

  • 顺序存储结构
    对于完全二叉树来说,可以将其元素逐层放到一维连续数组中 ABCDEF
    这里写图片描述

    但是对于一般的二叉树这样就容易造成空间浪费这里写图片描述

2:对于任意的二叉树来说,每个节点只有一个双亲结点,对多有两个孩子结点,因此可以设计每个节点至少包含三个域分别是数据域,右孩子域和左孩子域。用C语言定义二叉树的二叉链表结点结构如下:

typedef struct Node
{
    DataType element;
    struct Node *LChild;
    struct Node *RChild;
}BiTNode,*BiTTree;

若一个二叉树有N个节点,必有2*N个指针域,其中有N+1个空指针
4任意一棵树与二叉树之间的转换
任意一棵树都可以转化为一棵二叉树,任意一棵二叉树都可以转换为一棵树,且这种转化具有唯一性。
一棵树转换为一棵二叉树:
在兄弟之间增加一条连线,对每一个节点除了保持其与左孩子的连线外,其他孩子之间的连线全部断掉。
一棵二叉树转换为一棵树:
若节点X是双亲Y的左孩子,则把X的右孩子,右孩子的右孩子。。。都与Y相连,去掉原有的双亲到右孩子的连线。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36130482/article/details/79499067