数据结构之树
作者:互联网
前言
数据结构中,树非常重要,在此记录学习
参考文章:
1. 树的定义
树是一种非线性的数据结构,是由n(n >=0)个结点组成的有限集合。
特点:
- 每个结点有零个或多个子结点;
- 没有父结点的结点称为根结点;
- 每一个非根结点有且只有一个父结点;
- 除了根结点外,每个子结点可以分为多个不相交的子树;
术语:
- 节点的度:一个节点含有的子树的个数称为该节点的度;
- 叶节点或终端节点:度为0的节点称为叶节点;
- 节点深度:对任意节点x,x节点的深度表示为根节点到x节点的路径长度。所以根节点深度为0,第二层节点深度为1,以此类推
- 节点高度:对任意节点x,叶子节点到x节点的路径长度就是节点x的高度
- 树的深度:一棵树中节点的最大深度就是树的深度,也称为高度
- 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
- 子节点:一个节点含有的子树的根节点称为该节点的子节点
- 节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推
- 兄弟节点:拥有共同父节点的节点互称为兄弟节点
度:节点的子树数目就是节点的度 - 祖先:对任意节点x,从根节点到节点x的所有节点都是x的祖先(节点x也是自己的祖先)
- 后代:对任意节点x,从节点x到叶子节点的所有节点都是x的后代(节点x也是自己的后代)
- 森林:m颗互不相交的树构成的集合就是森林
2. 二叉树
每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
性质:
- 1.若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)
- 2.高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)(空树的高度为-1)
- 3.对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1
2.1 二叉树的种类
-
满二叉树
叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点。
-
完全二叉树
对于一颗二叉树,假设其深度为d(d>1)。除第d层外的所有节点构成满二叉树,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
-
霍夫曼树
带权路径最短的二叉树称为哈夫曼树或最优二叉树。 -
二叉查找树(二叉搜索树、二叉排序树、BST)
性质:- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
- 它的左、右子树也分别为二叉排序树。
-
平衡二叉树 AVL
是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树。
使用场景:- AVL树适合用于插入删除次数比较少,但查找多的情况。
- 也在Windows进程地址空间管理中得到了使用
- 旋转的目的是为了降低树的高度,使其平衡
-
B树/B-树
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。
能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)
它或者是空树
特点: -
1.定义任意非叶子结点最多只有M个儿子;且M>2
-
2.根结点的儿子数为[2, M]
-
3.除根结点以外的非叶子结点的儿子数为[M/2, M]
-
4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
-
5.非叶子结点的关键字个数=指向儿子的指针个数-1
-
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]
-
7.非叶子结点的指针:P[1], P[2], …, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
-
8.所有叶子结点位于同一层
-
B+树
B+树是B-树的变体,也是一种多路搜索树
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
区别:- B+树 有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点;
- B+树 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接
特性:
- 1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
- 2.不可能在非叶子结点命中
- 3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
- 4.更适合文件索引系统
原因: 增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率
B树:有序数组+平衡多叉树
B+树:有序数组链表+平衡多叉树
- 红黑树
红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。
通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。
2.2 二叉树的遍历
- 中序遍历:即左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的节点i,其必然为叶子,然后遍历i的父节点,再遍历i的兄弟节点。随着递归的逐渐出栈,最终完成遍历
- 先序遍历:即根-左-右遍历
- 后序遍历:即左-右-根遍历
- 层次遍历:从根节点依次往下一层一层遍历
标签:结点,遍历,叶子,关键字,之树,二叉树,数据结构,节点 来源: https://blog.csdn.net/weixin_45063703/article/details/118879956