数据结构分为两种:
表示型和存储型,树就是表示型,表示某种结构
树的概念
树是一种非线性的数据结构,它是由n个有限结点组成的一个具有层次关系的集合
它有一个特殊的结点,叫做根节点,根节点没有前驱结点
除根节点外,其余的结点被分为M(M>0)个互不相交的集合(T1,T2......Tm),其中每一个集合Ti(1<=i<=m)又是一棵结构与树类似的子树,每棵子树的根结点有且仅有一个前驱,可以有0个或多个后续
因此,树是递归定义的
注意:
树形结构中,子树之间不能由交集,否则就不是树形结构
eg.
树的相关概念
节点的度:一个节点含有的子树的个数称为该节点的度(上图中的A的度为6)
叶节点(终端节点):度为0的节点称为叶节点
分支节点:度不为0的节点
双亲节点(父节点):若一个节点含有子节点,则这个节点称为其子节点的父节点
孩子节点(子节点):一个节点含有的字数的根节点称为该节点的子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点
树的高度:树中节点的最大层次
节点的祖先:从根节点到该节点所经分支上的所有节点
子孙:以某节点为根的子树中任一节点都称为该节点的子孙
总边数与度之间的关系为:n-1(总边数)=0*n0+1*n1+2*n2+3*n3.(ni表示度为i的节点的个数)
树的拆分
任何一棵树都会被拆分为根和子树,直到将所有子树拆分完.
树的表示
左孩子右兄弟表示法
//第一种
struct TreeNode
{
int val;
//定义顺序表存储子树
struct TreeNode** subA;//一个指针数组
int size;
int capacity;
};
//第二种
//左孩子,右兄弟
//不管有几个子树,第一个指针都只指向第一个子树,第二个指针指向相邻的兄弟
struct TreeNode
{
int val;
struct TreeNode* leftChild;
struct TreeNode* nextBrother;
};
第二种树如下图:
双亲表示法
物理结构(在内存中如何存储):数组(数组存储父亲的下标)(没有父亲就存-1)
逻辑结构:森林
eg.
二叉树的概念及结构
二叉树的概念
一棵二叉树是节点的有限集合,该集合:
1.或者为空
2.由一个根节点加上两棵别称为左子树和右子树的二叉树组成
二叉树的一个节点最多有两个子树(0~2个)
二叉树的子树有左右之分,次序不能颠倒
二叉树单纯存储数据没有太大价值,不如链表和顺序表,他的优点在于"搜索二叉树"
二叉树的应用
搜索二叉树:
1.存储数据
2.搜索数据
数据特点:左子树<根<右子树
查找最多进行"高度次"
但是搜索二叉树存在问题,树可能退化:
特殊的二叉树
1.满二叉树
前n-1层全满,每一个节点的度都是2,叶子节点都在最后一层
2.完全二叉树
前n-1层全满,最后一层不一定满,但要求从左到右的节点是连续的
完全二叉树的顺序存储:
物理结构:数组
逻辑结构:二叉树
完全二叉树的父子间存储的下标位置规律:
leftchild = parent*2 + 1
rightchild = parent*2 + 2
parent = (child - 1)/2
为防止空间浪费,数组存储只适合完全二叉树和满二叉树