树的基本算法

森林与二叉树的转换

1.树与二叉树的转换:

  1. 所有相邻兄弟节点之间加一条连线
  2. 对于每个分支节点,除最左孩子节点以外,删去该节点与其他孩子节点连线
  3. 以根节点为轴心,顺时针旋转45°;即横线化为与右儿子连线,斜线化为与左儿子连线

如图:

2.森林转化为二叉树

  1. 将森林中所有树转化为二叉树
  2. 从最后一颗二叉树开始,依次吧后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子,直到所有二叉树全部连接

3.二叉树转化为一般树

  1. 若节点u是其父节点f[u]的左儿子节点,则将u的右儿子节点以及u的右儿子节点的右儿子节点,u的右儿子的右儿子的.......的右儿子节点,直到叶子节点都与f[u]虚线相连
  2. 删除所有节点与其右儿子节点的连线
  3. 将虚线改为实线

如图:

 

节点与度的相关计算

1.基本概念:

  1. 节点的度:节点拥有的子树个数
  2. 树的度:各节点的度的最大值
  3. 节点的层次:根节点在第1层,其子节点在第2层;若某节点在第k层,则其子节点在第k+1层
  4. 树的深度:各节点的层数的最大值

2.数量关系

  1. 节点总数=所有节点度数之和+1
  2. 度为k的树第i层节点数 <= ki-1
  3. 深度为h的k叉树节点数 <= (kh - 1) / (k - 1)

对于二叉树:

  1. 具有n个节点的二叉树具有n-1个分支
  2. 二叉树第i层至多由2i-1个节点
  3. 深h的二叉树至多有2h-1个节点

由遍历序列恢复二叉树

1.已知前序、中序遍历求二叉树

在前序序列中,第1个节点一定是二叉树的根节点,而在中序遍历中,根节点的左子树一定出现在根节点之前,右子树一定出现在根节点之后

因此,可以通过前序遍历确定根节点,中序遍历分类属于其左子树的节点和属于右子树的节点,再从左右子树中分别用前序遍历确定其根节点

循环若干次后即可将二叉树还原

2.已知后序、中序遍历求二叉树

后序遍历最后一个节点为二叉树根节点,在中序遍历中,此节点的左边节点必定为其左子树,右边节点必定为右子树

在后序遍历中确定左、右子树的根节点,再次确定左右子树,循环若干次后二叉树可还原

B-树

定义:

一个m阶B-树为满足如下条件的m叉树

  1. 每个分支最多有m个子树
  2. 除根节点外,每个节点至少有 m/2(上取整)个节点
  3. 根节点至少有两个子树,除非根节点是叶节点
  4. 所有叶节点都在同一层上,叶节点无关键字
  5. 所有分支包含如下信息

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+树满足以下条件

  1. 每个分支最多有m个子树
  2. 除根节点外,每个节点至少有 m/2(上取整)个节点
  3. 根节点至少有两个子树,除非根节点是叶节点
  4. 具有n个子树的节点有n个关键字
  5. 叶子节点中存放记录的关键字以及只想记录的指针,或者数据分块后的最大关键字值以及指向块的指针,叶节点按关键字的大小顺序链成链表

key1,p1,key2,p2,....,keyn,pn

n为关键字值的数量,n<=m

  1. 所有分支节点可堪称索引的索引,节点中只包含它的各个孩子节点中最大(或最小)关键字值和指向孩子节点的指针

 

posted @ 2022-05-12 23:55  STEllIAF0X  阅读(213)  评论(0编辑  收藏  举报