一、树和二叉树
- 树
1、树的定义:
树(Tree)是由n(n>0)个结点组成的有限集;在任意一棵非空树中 :
(1)有且仅有一个根结点
(2)当n>1时 其余结点可以分为m(m>0)个互不相交的有限集T1,T2...Tm ;其中每个集合本身又是一棵树 并且称为根的子树SubTree
2、树的结点:包含一个数据元素以及若干个指向其子树的分支(保存数据与数据之间的关系)
3、结点的度(Degree):数据拥有的子树的数量
(1)度为0的结点称之为叶子结点(leaf)或者终端结点
(2)度不为0的结点称为分支结点或者非终端结点
4、 结点层次(level):从根开始定义,根为第一层,根的孩子为第二层...
(1)树中结点最大层次称为树的高度或者深度
- 二叉树
1、二叉树(Binaru Tree):每个结点最多只有两棵子树的树,且其左右子树的次序不能随意颠倒
2、二叉树的五种形态:
(1)NULL,空树,树不存在
(2) 只有一个结点(根结点)
(3)只有一个右子结点
(4)只有一个左子结点
(5)有左右结点
二、二叉树的性质
- 在二叉树的第i层上最多有 2^(i-1) 个结点(i>=1)
- 深度为k的二叉树最多有 2^k -1 个结点(k>=1)
- 叶子结点数 = 度为2的结点数 + 1
- 满二叉树:在不改变树的高度的情况下,无法再往这棵树里添加任何结点----一棵高度为k并且有2^k -1个结点的二叉树就叫做满二叉树
- 完全二叉树:除去最后一层为一棵满二叉树;最后一层的左边结点是连续排列
- 如果对一棵有n个结点的完全二叉树 从上到下 从左到右 给每个结点从1开始编号,则一个编号为 i 的结点有:
- 他的父节点的编号是i/2
- 他的左子结点(如果有)的编号为2*i
- 他的右子结点(如果有)的编号为2*i + 1
三、二叉树的实现
- 顺序结构
根据二叉树的性质,对所有结点进行编号,并且每一个结点的编号有如上性质;则 对于一棵完全二叉树可以直接用一个数组来保存它:
typedef int TElemType; //树中结点的数据类型
#define MAX_TREE_SIZE 1024 ; //树中最大结点的数量 TElemType SeqBiTree[MAX_TREE_SIZE]; //真正保存结点的数据
- 链式结构
用一个数据域来保存结点的数据元素
用两个指针域 分别保存他的左子结点和右子结点
typedef int TElemType; //树中结点保存的数据的 类型
//树的结点的类型
typedef struct binode
{
TElemType data; //数据域
struct binode * lchild; //保存左子结点的指针
struct binode * rchild;//保存右子结点的指针
}BINODE;