1.特殊的二叉树
1.1满二叉树
特点:
- 每一层上的结点数都是最大结点数(即每层都满)
- 叶子结点全部在最底层
- 满二叉树在同样深度的二叉树中结点个数最多
- 满二叉树在同样深度的二又树中叶子结点个数最多
编号原则:
- 每一结点位置都有元素
- 从根结点开始,自上而下,自左而右。
1.2完全二叉树(一一对应)
实例如下:
- 核心1:在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一棵完全二叉树.
- 核心2:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
特点:
1.3斜树(了解即可,本质就是线性结构)
左斜树:所有的结点都只有左子树的二叉树
右斜树:所有的结点都只有右子树的二叉树
2.二叉树的相关性质
2.1性质1(某层结点数,max)
注意:第i层上至少有1个结点
(如果1个结点都没有,就不可能有这么多层了)
证明:
2.2性质2(整树结点数,max)
注意:深度为k时至少有k个结点
(深度为k,每一层上至少有1个结点,总共k个结点)
证明:
2.3性质3(叶子结点数 与 度为2的结点数)
分析过程为重
证明:
2.4性质4(通过结点数 求 完全二叉树的深度)
证明:
2.5性质5(双亲 与 孩子结点的编号关系)
如果对一颗有n个结点的完全二叉树(深度为 [log2n]+1 )
结点按层序编号(从第1层到第 [log2n]+1层,每层从左到右),
则对任一结点i(1≤n),有:
示例:
3.二叉树的存储结构
3.1二叉树的顺序存储结构(用数组存储)
(适合满二叉树,完全二叉树)
3.1.1顺序存储规则:
以满二又树的结点层次形式编号,依次存放二叉树中的数据元素。
例1:
例2:
3.1.2通过存储表画出二叉树
(1)先画出对应深度的满二叉树,并标号
(2)通过存储表中的序号进行元素填入,得到对应的二叉树
3.1.3顺序存储的缺点
3.2二叉树的链式存储结构
3.2.1链式存储图解
3.2.2代码如下:(二叉链表)
#include<stdio.h>
#include<stdlib.h>
typedef int TElemType;//树中元素基本类型
//二叉树结点链式存储结构(二叉链表)
typedef struct BiNode
{
TElemType data;//数据域
struct BiNode* lchild, * rchild;//左,右孩子指针
}BiNode,*BiTree;
//BiNode:用来定义结点类型
//BiTree:用来定义树类型
3.2.3特性
在n个结点的二叉链表中,有n+1个空指针域
分析:
3.2.4三叉链表(添加了一个指向双亲的指针域)
更便于访问双亲结点
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int TElemType;//树中元素基本类型
//二叉树结点链式存储结构(三叉链表)
typedef struct TriTNode
{
TElemType data;//数据域
struct TriNode* lchild, * parent,* rchild;//左孩子,双亲,右孩子指针
}TirNode, * TirTree;
//TirNode:用来定义结点类型
//TirTree:用来定义树类型