数据结构之二叉树基本概念
#二叉树的定义
二叉树是一个有穷的结点集合
这个集合可以为空
若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成
二叉树有五种基本形态:空结点,只有一个根结点,只有根结点和左子树,只有根结点和右子树,有根结点和左子树及右子树
注:二叉树的子树有左右顺序之分
#特殊二叉树:
1.斜二叉树(Skewed Binary Tree):所有二叉树树只有左儿子或者只有右边 儿子,相当于链表
2.完美二叉树(Perfect Binary Tree)/满二叉树(Full Binary Tree):除了叶子结点每个结点都有 两个儿子
3.完全二叉树(Complete Binary Tree) :有n个结点的二叉树,对树中结点按照从上到下从左到右的顺序编号,编号为i的结点与满二叉树中编号为i的结点在二叉树中的位置相同(换言之就是在满二叉树中从最后一层从最右边开始依次去掉最后几个叶子结点即可得到完全二叉树)
#二叉树的重要性质
一个二叉树第i层的最大结点数为2^(i-1)
深度为k的二叉树有最大结点总数为2^K -1(等比数列求和:1+21+22+23+…+2(k-1)=2^K -1)
对于任何非空二叉树T,若n0表示 叶子结点的个数,n1表示度为1的非叶结点个数,n2表示度为2的非叶结点个数,那么两者满足关系n0=n2+1
证明如下:总的边数=总结点数-1=n0+n1+n2-1,每个ni结点对向下的边的贡献为i,那么总边数 =n0+n1+n2=0×n0+1×n1+2×n2.两边化简既得n0=n2+1
#二叉树的存储结构
1.顺序存储结构(用数组存储)
适用于完全二叉树:按照从上至下,从左至右顺序存储,一般二叉树也可以用这种结构 ,但是会造成空间浪费
n个结点的完全二叉树的结点父子关系:
非根结点i的父节点的序号是[i/2]
结点i的左孩子结点的序号是2i(若2i<=n,否则没有左孩子)
结点i的右孩子结点的序号是2i+1(若2i+1<=n,否则没有左孩子)
2.链表存储
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};