二叉树

来源:互联网 发布:并发编程 英文 编辑:程序博客网 时间:2024/05/16 05:44


一、定义

          二叉树也叫二分树,是有限节点的集合,这个集合要么为空,要么是由一个根节点和两颗互不相交的称为左子树和右子树的二叉树组成。


注意:二叉树和度为2的树(2次树)是不同的,其差别在:1、度为2的树中至少有一个节点的度为2,而二叉树没有这个要求;2、度为2的树不区分左右子树,而二叉树是严格区分左右子树的。


满二叉树:如果所有分支节点都有左右孩子,并且叶子节点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。高度为h,则有2^h-1个节点。

                   特点:1、叶子节点都在最下一层;2、只有度为0和度为2的节点。


完全二叉树:若二叉树最多只有最下面两层的节点的度数小于2,并且最下面一层的叶子节点都一次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树。

                    特点:1、叶子节点只可能在层次最大的两层出现。

                                2、如果有度为1的节点,只可能有一个,且该节点只有左孩子而无右孩子。

                                3、一旦出现某节点(编号为i)为叶子节点或者只有左孩子,则编号大于i的节点均为叶子节点。

                                4、当叶子节点总数n为奇数时,n1=0,当叶子节点总数n为偶数时,n1=1。、


二、二叉树的性质


1、非空二叉树上的叶子节点数等于双分支节点数加1.

n = n0+n1+n2=n1+2n2+1 ---------------->  n0 = n2+1


2、非空二叉树上第i层上至多有2^(i-1)个节点。


3、高度为h的二叉树至多有2^h-1个节点。


4、对于完全二叉树,2i<=n,则编号为i的节点为分支节点,否则为叶子节点。

                               若n为奇数,则分支节点既有左孩子又有右孩子;若n为偶数,则编号最大的分支节点(编号为n/2)只有左孩子,没有右孩子。其余分支节点都有左右孩子。

                               若编号为i的节点有左孩子节点,则左孩子编号为2i;若编号为i的节点有右孩子节点,则右孩子编号为2i+1。

                               除根节点,若一个节点编号为i,则它的双亲节点编号为i/2,当i为偶数,其为左孩子节点;当i为奇数时,其为右孩子节点。


三、二叉树与树、森林之间的转换


定理:任何一个森林或者一棵树都可以转化为一个二叉树,反之,任一颗二叉树也能唯一地对应一个森林或者一棵树。

ps:对于一般的树来说,数中节点的左右次序无关紧要,而对于二叉树,左右孩子节点的次序不能颠倒。


1、森林、树转换为二叉树

若森林T={T1,T2,....,Tm}是m颗树的序列,则对应二叉树的构造方法为:

  • 若m=0,则为空二叉树
  • 若m>0,则二叉树根节点为T1的根节点,左子树为T1的子树,右子树为{T2,T3,...Tm}
  • 一棵树是森林中的特殊情况,其二叉树的根节点没有右子树。

ps:左子树为其一个孩子,右子树为其一个兄弟,类似孩子兄弟链结构。



2、二叉树还原为森林、树



四、二叉树的存储结构


1、顺序存储结构

编号过程:首先把根节点的编号定位1,然后从上往下,从左往右的顺序,对每一个节点进行编号。当某节点是编号为i的双亲节点的左孩子时,它的编号为2i,当它是右孩子时,它的编号为2i+1。

typedef ElemType SqBTree[MaxSize];            一般为字符数组,元素值为节点的内容,当某节点为空节点时,对应位置用‘#’号表示。


特点:1、0号索引不用!!

             2、对于完全二叉树,采用顺序存储结构非常合适,它能够充分利用存储空间,但是对于一般的二叉树,会存在大量的空间浪费。


2、链式存储结构

    也叫二叉链。

 typedef struct node {

      ElemType data;

      struct node *lchild;

      struct node *rchild;

}BTNode;



0 0
原创粉丝点击