2013年10月29日 星期二 09时45分44秒
回顾:
链表 - 单向链表和双向链表
链表数组、数组链表、二维链表(不是很常用)
今天:
树 - 有序二叉树
树型结构就是 数据元素是 一对多的父子关系
树型结构中最简单的就是 二叉树,就是每个父节点最多只能有2个子节点,每个子节点只有一个父节点。每个树都只有一个 跟节点,其它节点都是由 根节点衍生。
树型结构 都是 先天具有递归特性,因此编码上倚重递归;
二叉树遍历:
前序遍历 - D L R
中序遍历 - L D R
后序遍历 - L R D
几种特殊的二叉树:
1.满二叉树
特点: 所有枝节点和根节点都必须有左右子节点 并且 每层节点树必须是最大值
2.完全二叉树
特点: 除了最下层,节点数必须是最大值,并且 最下层的节点必须连续的从左向右排列
3.平衡二叉树
特点: 每个节点的 左右子树的层差 绝对值 不能超过1
二叉树可以用顺序结构和链式结构实现。但一般都是 链式结构实现
顺序结构实现二叉树 必须保证二叉树是完全二叉树,不是完全二叉树的必须用空(虚节点)补成完全二叉树再存储,从而避免造成大量空间浪费。
链式结构的二叉树分为:二叉链表 和 三叉链表
二叉链表: 数据、左右子节点指针
三叉链表: 数据、左右子节点指针、父节点指针
有序二叉树 - 每个节点左边的所有节点(左子树)都比 它小(也可以等于),右边的所有节点都比它大(也可以等于)
有序二叉树的中序遍历 得到的结果是有序的(升序,从小到大)
算法: 广义上说,解决问题的方案就是算法
学习的算法:排序算法和查找算法
排序:
冒泡、选择、插入、快速和归并排序
查找:
顺序查找、二分查找
冒泡排序
算法: 相邻两个比较,如果前面比后面大,交换位置,从第一个元素到最后一个元素比较完毕算一轮,再依次比较前n-1个元素。每轮完成后,确保最大的放在了最后面。
特点: 平均时间复杂度O(N的平方)
稳定排序
对数据的有序性非常敏感(原数据越接近有序,效率越高)
插入排序
算法: 先认定第一个元素有序,把第二个元素插入前1个有序数列,保证前2个有序。依次插入第3-N个元素,最后的结果就是前n个元素有序 -> 排序OK
特点: 平均时间复杂度 O(N的平方)
稳定排序
对数据有序性 非常敏感(原数据越接近有序效率越高)
但由于只移动不交换,所以优于冒泡
回顾:
链表 - 单向链表和双向链表
链表数组、数组链表、二维链表(不是很常用)
今天:
树 - 有序二叉树
树型结构就是 数据元素是 一对多的父子关系
树型结构中最简单的就是 二叉树,就是每个父节点最多只能有2个子节点,每个子节点只有一个父节点。每个树都只有一个 跟节点,其它节点都是由 根节点衍生。
树型结构 都是 先天具有递归特性,因此编码上倚重递归;
二叉树遍历:
前序遍历 - D L R
中序遍历 - L D R
后序遍历 - L R D
几种特殊的二叉树:
1.满二叉树
特点: 所有枝节点和根节点都必须有左右子节点 并且 每层节点树必须是最大值
2.完全二叉树
特点: 除了最下层,节点数必须是最大值,并且 最下层的节点必须连续的从左向右排列
3.平衡二叉树
特点: 每个节点的 左右子树的层差 绝对值 不能超过1
二叉树可以用顺序结构和链式结构实现。但一般都是 链式结构实现
顺序结构实现二叉树 必须保证二叉树是完全二叉树,不是完全二叉树的必须用空(虚节点)补成完全二叉树再存储,从而避免造成大量空间浪费。
链式结构的二叉树分为:二叉链表 和 三叉链表
二叉链表: 数据、左右子节点指针
三叉链表: 数据、左右子节点指针、父节点指针
有序二叉树 - 每个节点左边的所有节点(左子树)都比 它小(也可以等于),右边的所有节点都比它大(也可以等于)
有序二叉树的中序遍历 得到的结果是有序的(升序,从小到大)
算法: 广义上说,解决问题的方案就是算法
学习的算法:排序算法和查找算法
排序:
冒泡、选择、插入、快速和归并排序
查找:
顺序查找、二分查找
冒泡排序
算法: 相邻两个比较,如果前面比后面大,交换位置,从第一个元素到最后一个元素比较完毕算一轮,再依次比较前n-1个元素。每轮完成后,确保最大的放在了最后面。
特点: 平均时间复杂度O(N的平方)
稳定排序
对数据的有序性非常敏感(原数据越接近有序,效率越高)
插入排序
算法: 先认定第一个元素有序,把第二个元素插入前1个有序数列,保证前2个有序。依次插入第3-N个元素,最后的结果就是前n个元素有序 -> 排序OK
特点: 平均时间复杂度 O(N的平方)
稳定排序
对数据有序性 非常敏感(原数据越接近有序效率越高)
但由于只移动不交换,所以优于冒泡