树的基本算法
森林与二叉树的转换
1.树与二叉树的转换:
- 所有相邻兄弟节点之间加一条连线
- 对于每个分支节点,除最左孩子节点以外,删去该节点与其他孩子节点连线
- 以根节点为轴心,顺时针旋转45°;即横线化为与右儿子连线,斜线化为与左儿子连线
如图:
2.森林转化为二叉树
- 将森林中所有树转化为二叉树
- 从最后一颗二叉树开始,依次吧后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子,直到所有二叉树全部连接
3.二叉树转化为一般树
- 若节点u是其父节点f[u]的左儿子节点,则将u的右儿子节点以及u的右儿子节点的右儿子节点,u的右儿子的右儿子的.......的右儿子节点,直到叶子节点都与f[u]虚线相连
- 删除所有节点与其右儿子节点的连线
- 将虚线改为实线
如图:
节点与度的相关计算
1.基本概念:
- 节点的度:节点拥有的子树个数
- 树的度:各节点的度的最大值
- 节点的层次:根节点在第1层,其子节点在第2层;若某节点在第k层,则其子节点在第k+1层
- 树的深度:各节点的层数的最大值
2.数量关系
- 节点总数=所有节点度数之和+1
- 度为k的树第i层节点数 <= ki-1
- 深度为h的k叉树节点数 <= (kh - 1) / (k - 1)
对于二叉树:
- 具有n个节点的二叉树具有n-1个分支
- 二叉树第i层至多由2i-1个节点
- 深h的二叉树至多有2h-1个节点
由遍历序列恢复二叉树
1.已知前序、中序遍历求二叉树
在前序序列中,第1个节点一定是二叉树的根节点,而在中序遍历中,根节点的左子树一定出现在根节点之前,右子树一定出现在根节点之后
因此,可以通过前序遍历确定根节点,中序遍历分类属于其左子树的节点和属于右子树的节点,再从左右子树中分别用前序遍历确定其根节点
循环若干次后即可将二叉树还原
2.已知后序、中序遍历求二叉树
后序遍历最后一个节点为二叉树根节点,在中序遍历中,此节点的左边节点必定为其左子树,右边节点必定为右子树
在后序遍历中确定左、右子树的根节点,再次确定左右子树,循环若干次后二叉树可还原
B-树
定义:
一个m阶B-树为满足如下条件的m叉树
- 每个分支最多有m个子树
- 除根节点外,每个节点至少有 m/2(上取整)个节点
- 根节点至少有两个子树,除非根节点是叶节点
- 所有叶节点都在同一层上,叶节点无关键字
- 所有分支包含如下信息
n,p0,key1,p1,key2,p2,....,keyn,pn
n为关键字值的数量,n<=m-1
key为关键字,keyi<keyi+1,pi为指向该节点第i+1棵子树的指针
B-树的查找
对于关键字k,找到第一个
B-树的插入
从空树开始逐个插入关键字,若关键字数量>m-1,则将该节点分裂
设t=m/2(上取整),则以key[t]为中心,将原有节点分裂为key[0:t-1],key[t],key[t:],将key[t]提升为父节点的关键字
若节点分裂导致父节点关键字数量>m-1,则对父节点进行节点分裂
B+树
m阶b+树满足以下条件
- 每个分支最多有m个子树
- 除根节点外,每个节点至少有 m/2(上取整)个节点
- 根节点至少有两个子树,除非根节点是叶节点
- 具有n个子树的节点有n个关键字
- 叶子节点中存放记录的关键字以及只想记录的指针,或者数据分块后的最大关键字值以及指向块的指针,叶节点按关键字的大小顺序链成链表
key1,p1,key2,p2,....,keyn,pn
n为关键字值的数量,n<=m
- 所有分支节点可堪称索引的索引,节点中只包含它的各个孩子节点中最大(或最小)关键字值和指向孩子节点的指针
本文来自博客园,作者:STEllIAF0X,转载请注明原文链接:https://www.cnblogs.com/STEllIAF0X/p/tree.html