/* 6.5 二叉树 二叉树具有五种基本形态: 1.空二叉树。2.只有一个根节点。3.根结点只有左子树。4.根结点只有右子树。5.根节点既有左子树又有右子树。 特殊二叉树: 1.斜树 斜树一定要是斜的,但是往哪斜还是有讲究,所有结点都只有左子树的二叉树叫左斜树。所有结点都只有 右子树的二叉树叫右斜树。这两者统称为斜树(这不就是线性表么) 2.满二叉树 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。 3.完全二叉树 */ /* 6.6 二叉树的性质 二叉树有一些需要理解并记住的特性,以便我们更好的使用它。 6.6.1 二叉树性质1 在二叉树的第i层上至多有2^(i-1)个结点(i>=1) 6.6.2 二叉树的性质2 深度为k的二叉树至多有2^k -1个结点(k>=1) 6.6.3 二叉树性质3 对任何一颗二叉树T,如果其终端结点数位n0,度为2的结点数为n2,则n0=n2+1 6.6.4 二叉树性质4 具有n个结点的完全二叉树的深度为log_2 n +1 6.6.5 二叉树性质5 如果对一颗有n个结点的完全二叉树(其深度为)的结点按层序编号(从第1层到第层,每层从左到右),对任一结点i(1<=i<=n) ... */ /* 6.7 二叉树的存储结构 6.7.1 二叉树的顺序存储结构 前面谈到树的存储结构,并且谈到顺序存储对树这种一对多的关系结构实现起来比较困难。但是二叉树是一种特殊的树。 由于它的特殊性,使得用顺序存储结构也可以实现。 二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系, 比如双亲与孩子的关系,左右兄弟的关系等。 ******* 先来看看完全二叉树的顺序存储,一颗完全二叉树... A B C D E F G H I J 将这颗二叉树存入数组中,相应的下标对应其同样的位置, 1 2 3 4 5 6 7 8 9 10 A B C D E F G H I J ****** 当然对于一般的二叉树,尽管层序编号不能反映逻辑关系,但是可以将其按完全二叉树编号,只不过,把不存在的结点设置为"^"而已。 A B C ^ E ^ G ^ ^ J 1 2 3 4 5 6 7 8 9 10 A B C ^ E ^ G ^ ^ J 虽然可以表示,但会有空间的浪费,对于数据比较多的树来说,树的顺序存储结构一般只用于构建完全二叉树 6.7.2 二叉链表 既然顺序存储适用性不强,我们就要考虑链式存储结构。二叉树,每个结点最多有两个孩子,所以它设计一个数据域和两个指针域是比较自然的想法, 我们称这样的链表叫做二叉链表。 //二叉树的二叉链表结点结构定义 typedef struct BiTNode { //结点数据 TElemType data; //左右孩子指针 struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; 就如同树的存储结构中讨论的一样,如果有需要,还可以再增加一个指向双亲的指针域,那样就称之为三叉链表。由于加额树的 存储结构类似,这里就不详述了。 */ /* 6.8 遍历二叉树 */