数据结构——链表、二叉树、排序算法
链表(线性)
- 概念
一种存储结构,每一个数据元素 ai 都有两个部分组成:存储本身信息的数据域和一个存储其后继信息的指针域(组成一个结点);指针域中存储的信息称为指针或链。n个结点链结成一个链表(线性链表)。
整个链表的存取必须从一个头指针开始进行,头指针指向链表的第一个结点的存储位置,由于最后一个数据元素没有直接后续,所以链表的最后一个结点的指针为空(null)。
-
链表的插入
-
链表的删除
树和二叉树
树
- 定义
以分支关系定义的层次结构。是n(n>=0)个结点的有限集,在任意一颗非空树中,有且仅有一个特定的称为根的结点。 - 树的结点
包含一个数据元素及若干指向其子树的分支。 - 度
由从根到该结点所经分支和结点构成路径。结点拥有的子树数称为结点的度。度为0的结点称为叶子或终端结点。树的度是树内个结点度的最大值。树的深度是树中节点的最大层次。
二叉树(有序树)
- 二叉树定义:是另一种树型结构,他的特点是每一个结点至多只有两颗子树(即二叉树中不存在度大于2的结点),且二叉树的子树有左右之分,齐次序不能任意颠倒。(二叉树和树是两种不同的树型结构,不等同与度为2的有序树)
- 遍历二叉树
-
先序遍历:
- 访问根节点;D
- 先序遍历左子树;L
- 先序遍历右子树;R
-
中序遍历
- 中序遍历左子树;L
- 访问根结点;D
- 中序遍历右子树; R
-
后序遍历:
- 后序遍历左子树;L
- 后续遍历右子树;R
- 访问根结点; D
-
完全二叉树:深度为k,有n个结点的二叉树,当且仅当对其每一个结点都与深度k的满二叉树中编号从1到n的结点一一对应。
-
赫夫曼树(最优二叉树):带权路径长度WPL(=线条数*结点上权)最小的二叉树
-
构造赫夫曼树
- 根据给定的n个权值{w1,w2,,,wn}构成n颗二叉树的集合F={T1, T2, T3,,Tn},其中每一颗二叉树Ti中只有一个带权为wi的根结点,其左右子树都为空;
- 在F中选取两颗根结点的权值最小的树作为左右子树构造一颗新的二叉树,且新的二叉树的根结点的权值是左右子树上根结点的权值之和;
- 在F中删除这两颗树,同时将新的二叉树加入到F中;
- 重负2,3,直到F只含一颗树为止。这棵树就是赫夫曼树。
- 平衡二叉树
-
定义:AVL树,他或者是一颗空树,或者是具有下列性质的二叉树:他的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差不超过1,。若将二叉树上结点的平衡因子BF定义为该结点的左子树的深度减去他的右子树的深度,则平衡二叉树上所以结点的平衡因子只可能是-1,0, 1。
-
如何构建平衡二叉树:旋转技术(略)
- 单向左旋转;
- 单向右旋转
- 双向旋转(先左后右);
- 双向旋转(先有后左)
排序算法
快速排序
- 算法原理
- 先从数列中取出一个数作为“基准”;
- 分区过程:将比基准大的放在右边,比基准小的放在左边;
- 在对左右分区重复第二步,直到每一个区间只有一个数。
- 时间复杂度:o(nlogn)
- 空间复杂度:o(logn)
希尔排序
- 算法原理:
- 先将整个待排序的记录序列分割成若干个子序列分别进行直接插入排序;
- 将多个基本有序数全体进行直接插入排序
- 时间复杂度:o(nlogn)
- 空间复杂度:o(1)
选择排序
- 算法原理:
- 在未排序的序列中找到最小或最大的元素,存放在排序起始位置;
- 在剩余的未排序的元素中继续寻找最小或最大的元素挡在排序的末尾;
- 重复2
- 时间复杂度:o(n^2)
- 空间复杂度:o(1)
总结
只是简单的概念总结。