1. 树的定义
树(tree)是包含 n(n≥0) [2] 个节点,当 n=0 时,称为空树,非空树中(n-1)条边的有穷集,在非空树中:
每个元素称为节点(node)
有一个特定的节点被称为根节点或树根(root)
除根节点之外的其余数据元素被分为m(m≥0)个互不相交的集合。
一定要注意每个节点除了和自己的双亲节点有联系,和其他节点不可相交,否则违背定义。另外树里面的上一级节点叫双亲,雌雄同体。如下所示就不是一颗树。
树中的其他概念节点的度:节点拥有的子树称为节点的度(degree)树的度:节点的度的最大值。max(节点的度);叶子节点:你可以想象树除了枝干会分叉,叶子上会长出叶子吗,所以叶子节点意思就是这个枝干的终点。终端节点。非终端节点:除根节点,非终端节点和叶子节点是非的关系,也叫做分支节点,也叫内部节点。
孩子:节点的子树的根节点就是该节点的孩子,相应的该节点就是孩子的双亲兄弟:同一个双亲的孩子互称兄弟祖先:根节点到该节点所经分支的所有节点。子孙:以某节点为根的子树中的任意节点。层次:类比人类宗族,每代人就是一层。深度或高度:树节点的最大层次就是树的高度。
树的分类树中任意 ...
2. 二叉树
每一个节点最多含有两个子树的树称为二叉树。在二叉树的概念下又衍生出满二叉树和完全二叉树的概念。
满二叉树除最后一层无任何子节点外,每一层上的全部结点都有两个子结点。也能够这样理解,除叶子结点外的全部结点均有两个子结点。节点数达到最大值,全部叶子结点必须在同一层上
完全二叉树若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层全部的结点都连续集中在最左边,这就是完全二叉树。
二叉树的遍历方式:遍历顺序
先序遍历:先根节点->遍历左子树->遍历右子树
中序遍历:遍历左子树->根节点->遍历右子树
后序遍历:遍历左子树->遍历右子树->根节点
示例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 ...
3. B树
B树也称B-树,它是一颗多路平衡查找树。B树的定义:
每个节点最多有m-1个关键字(可以存有的键值对)
根节点最少可以只有1个关键字
非根节点至少有m/2个关键字
每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同
每个节点都存有索引和数据,也就是对应的key和value。
描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母m表示阶数。根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m/2 <= k <= m-1。比如这里有一个5阶的B树,根节点数量范围:1 <= k <= 4,非根节点数量范围:2 <= k <= 4。
插入插入18,70,50,40插入22,发现这个节点的关键字已经大于4了,所以需要进行分裂接着插入23,25,39分裂
删 ...
4. B+树
B+树其实和B树是非常相似的。相同点:
根节点至少一个元素
非根节点元素范围:m/2 <= k <= m-1
不同点:
B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点。
内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。
每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接
父节点存有右孩子的第一个元素的索引
插入
插入5,10,15,20
插入25,此时元素数量大于4个了,分裂
接着插入26,30,继续分裂
删除对于删除操作是比B树简单一些的,因为叶子节点有指针的存在。
向兄弟节点借元素时,不需要通过父节点了,而是可以直接通过兄弟节点移动即可(前提是兄弟节点的元素大于m/2),然后更新父节点的索引。
如果兄弟节点的元素不大于m/2(兄弟节点也没有多余的元素),则将 ...
Git常用命令
创建版本库12git clone <url> // 克隆远程仓库git init // 初始化本地仓库
修改和提交123456789git status // 查看状态git diff // 查看变更内容git add . // 跟踪所有改动过的文件git add <file> // 跟踪指定的文件git mv <old> <new> // 文件改名git rm <file> // 删除文件git rm --cached <file> // 停止跟踪文件,但不删除git commit -m "comments" // 提交所有更新过的文件git commit - ...
关于我
关于我工作九年的大龄码农一枚,偶尔打打游戏,偶尔抽风学习。