【数据结构】二叉树

目录

树的概念

树的相关概念

树的表示

 二叉树的概念

二叉树的性质

特殊的二叉树

满二叉树

 完全二叉树


树的概念

        树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树,是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。

【数据结构】二叉树_第1张图片        注意:在树形结构种,子树之间不能有交集,否则便不是树形结构;

                   一棵树有N个结点,那么它便有N-1条边。

【数据结构】二叉树_第2张图片

 树的相关概念

【数据结构】二叉树_第3张图片

结点的度:一个结点含有的子树的个数称为该结点的度;如上图:A的度为6.

叶结点/终端结点:度为0的结点称为叶结点;如上图:B、C、H、I…等结点为叶结点。

分支结点/非终端结点:除根结点外,度不为0的结点;如上图:D、E…等结点为分支结点。

父节点/双亲结点:若一个结点含有子结点,则这个结点称为其子结点的父节点;如上图: A是B的父结点。

子结点/孩子结点:一个结点含有的子树的根节点称为该结点的子结点;如上图: B是A的子结点。

兄弟结点:具有相同父结点的结点互称为兄弟结点;如上图 :B、C是兄弟结点。

树的度:一颗树中,最大的结点的度称为树的度。如上图:树的度为6。

结点的层次:从根开始定义起,根为第1层,根的子节点为第二层,以此类推。

树的高度或深度:树中结点的最大层次,如上图:树的高度为4.

堂兄弟结点:双亲结点在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点。

结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先。

子孙:以某结点为根的子树中任一结点都称为该结点的子孙;如上图:所有结点都是A的子孙。

森林:由m(m>0)棵互不相交的树组成的集合称为森林。

树的表示

        树结构相对于线性表比较复杂,要存储表示起来就比较麻烦了,既要保存数据,也要保存结点和结点之间的关系,实际中树有很多种表示方法:如双亲表示法、孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。其中最常用的是孩子兄弟表示法,也就是左孩子右兄弟,如下:

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

即每个结点存储它的第一个左节点,和右边的兄弟结点位置即可,如图所示: 

【数据结构】二叉树_第4张图片

 二叉树的概念

        一棵二叉树是结点的一个有限集合,该集合:

                1.可以为空。---空树

                2.由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

【数据结构】二叉树_第5张图片

         注意:

                1.二叉树不存在一个度大于2的结点,结点度的大小范围为【0~2】,至多只能为2度;

                2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

        对于任意的二叉树都是由以下几种情况复合而成的:

【数据结构】二叉树_第6张图片

二叉树的性质

        1. 若规定根节点的层数为1,则一棵非空二叉树的 第i层上最多有 2^(i-1)个结点.。
        2. 若规定根节点的层数为1,则 深度为h的二叉树的最大结点数是 2^h-1
        3. 对任何一棵二叉树, 如果度为0其叶结点个数为a, 度为2的分支结点个数为b,则有 a=b+1
        4. 若规定根节点的层数为1,具有 n个结点的满二叉树深度h=log(n+1) 。 --(log是以2为底)
        5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
  •         若i>0,i位置节点的双亲序号:(i-1)/2;其中若 i=0,i为根节点编号,无双亲节点
  •         若2i+1=n否则无左孩子
  •         若2i+2=n否则无右孩子

综上,我们可以得出当已知父亲结点为i时,左孩子结点等于i*2+1,右孩子结点等于i*2+2;

当已知孩子结点(不分左右孩子)为k时,父亲节点=(孩子结点-1)/2.

特殊的二叉树

满二叉树

        一个二叉树,如果每一个层的结点数都达到最大值(除叶结点外,每个结点的度都为2),也就是说每个节点都要么没有子节点,要么有两个子节点,并且所有叶子节点都在同一层上,则这个二叉树就是满二叉树。

        因此满二叉树具有以下性质:

                1.如果一个二叉树的层数为k,则结点总数2^k-1

                2.如果一棵满二叉树的叶子节点数为m,则该树的总节点数2m-1

【数据结构】二叉树_第7张图片

如上图所示,满二叉树的特点是除黄框所圈的叶结点外,其余结点的度皆为二。

完全二叉树

        完全二叉树是效率很高的数据结构,是由满二叉树而引出来的。

        完全二叉树满足以下两个条件:

                1. 对于深度为 k 的节点,如果其存在,那么该节点的左子树深度为 k+1右子树深度为 k 或者 k+1

                2. 对于所有深度不足 k+1 的节点,如果该节点有右子树但是没有左子树,则该节点必须是一个叶子节点。

也就是说,在一棵完全二叉树中,除了最后一层的节点可能不满之外,其它层的节点都必须是满的,而且最后一层的节点都集中在树的左侧,这就是完全二叉树的特点。

【数据结构】二叉树_第8张图片

完全二叉树的叶子节点,从左向右必须连续的,而上图中叶子结点中间间断了因此不是一个完全二叉树。

如下图所示便是完全二叉树:

【数据结构】二叉树_第9张图片

你可能感兴趣的:(数据结构,数据结构,算法)