目录
一、树
1、概念与结构
树是一种非线性的数据结构,是由 n(n >= 0)个有限结点组成一个具有层次关系的集合。
由于像一棵倒挂的树(根朝上、叶朝下),所以称为 树 。
- 树有一个特殊结点,称为 根结点 ,它是第一个结点,没有前驱结点
- 除根结点外,其余结点被分成M(M > 0)个不相交的集合,即T1、T2、.......、Tm。其中、每一个集合又是一棵结构与树类似的子树,且每棵子树的根节点有且只有一个前驱结点,但是可以有0个或多个后继。所以、树是被递归定义的。
- 子树是不相交的
- 除了根结点为,每给结点有且仅有一个 父节点 / 双亲结点
- 一个 N 个结点的树有 N-1条边
2、相关术语
- 父结点 / 双亲结点:若一个结点含有子结点,则这个结点称为子结点的父结点,入A是D的父结点,而D又是H的父结点
- 子结点 / 孩子结点:一个含有子树的结点称为该结点的子结点,如B是A的子结点
- 结点的度:一个结点有几个子结点,就有几个度
- 树的度:哪个结点的度最多,那么该结点的度是多少,树的度就是多少
- 叶子结点 / 终端结点:度为 0 结点称为叶子结点
- 分支结点 / 非终端结点 :度不为 0 的结点
- 兄弟结点 :具有相同父结点的结点互称为兄弟结点
- 结点的层次:从根结点开始,根为第一层,根的子结点为第二层,以此类推
- 树的高度或深度:树中结点的最大层次
- 结点的祖先:从根到该结点上的所经过的分支的所有结点,例如:因为A-->E-->J-->Q,所以A、E、J是Q的祖先
- 路径:一条从树中任意结点出发沿父结点-->子结点连接,达到任意结点的序列,如:A-->Q的路径A-->E-->J-->Q、H-->Q的路径H-->D-->A-->E-->J-->Q
- 子孙:以某一个结点为根的子树中任一结点都为该结点的子孙
- 森林:由 m ( m > 0 ) 棵互不相交的树的集合称为森林
3、树的表示
孩子兄弟表示法:
struct TreeNode
{
struct Node* child; // 左边开始的第⼀个孩⼦结点
struct Node* brother; // 指向其右边的下⼀个兄弟结点
int data; // 结点中的数据域
};
二、二叉树
1、概念与结构
给树加个限制,就是它的子结点个数最多为2,且称为左子结点和右子结点。即一个二叉树是结点的一个有限集合,由一个根结点加上两棵别称为左子树和右子树的二叉树组成或者为空。
所以,二叉树具备以下特点
- 二叉树不存在度大于2的结点
- 二叉树有左右之分,次序不能颠倒,因此二叉树是有序树。
2、特殊的二叉树
1)满二叉树
如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果这个二叉树的层数为 K ,且结点总数是 2^k-1,那么它就是满二叉树
2)完全二叉树
完全二叉树是由满二叉树引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与度为 K 的满二叉树编号从 1 至 n 的结点一一对应时称之为完全二叉树。
注意:满二叉树是一种特殊的完全二叉树
例如:深度为3,有6个结点的完全二叉树
根据满二叉树的特点可知:
- 若规定根节点的层数为 1 ,则一棵非空二叉树的第 k 层上最多有 2^k-1 个结点
- 若规定根节点的层数为 1,则深度为 h 的二叉树的最大结点数是 2^h-1
- 若规定根节点的层数为 1,具有 n 个结点的满二叉树的深度 h = log2(n+1)(log以2为底,n+1为对数)
3、二叉树的存储结构
二叉树一般可以使用两种存储结构,一种是顺序存储,另一种是链式存储
1)顺序存储
顺序结构的存储使用数组来存储,一个使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间浪费
一般把堆(一种二叉树)使用顺序结构的数组来存储,要注意的是,这里的堆和操作系统虚拟进程地址空间中的堆是两回事,这里的堆是指数据结构
2)链式结构
二叉树的链式结构是指,用链表来表示一棵二叉树,即用链表来表示元素的逻辑关系。链表的每个结点通常由三个域表示,数据域和左右指针域,左右指针分别用来给出结点左孩子和右孩子所在链结点的存储地址。