数据结构 —— 递归和树
概况:
递归和分治
- 递归中用到了分治法。
- 分治法的思想简单概括就是“分而治之”。
- 递归实际使用“栈”来实现的。
- 递归包括递归方程、临界条件:
- EX:实现随机斐波那契数列?汉诺塔?八皇后-->N皇后?
- 时间复杂度:递归时间复杂度是很大的。
So可以用记忆递归法:牺牲空间,换取时间。(办法:放到数组里,数组空间浪费大,但读取快)
Ex:HDU 2041 超级楼梯、HDU 2044 一只小蜜蜂...
- 综上,做递归的题,要先分析,再总结出递归方程。
Ex:HDU 2050 折线分割平面 (标准递归题)
- 二分搜索(大整数的乘法、矩阵乘法(棋盘覆盖))
- 合并排序
- 快速排序
树
- 树的分支最多有2个。又叫孩子数。结点的左孩子,右孩子。
- 度是孩子个数。
- 叶子结点:度为0
- 基本概念:
树:树要么为空,要么由根结点和n(n>=0)棵子树组成
森林:由m(m>=0)棵树组成
结点的度:结点拥有的子树数
树的度:树内各结点度的最大值
叶子:度为零的结点,也称终端结点。
结点的层次:从根开始为第1层,根的孩子为第2层,依此类推。
树的深度:树内结点的最大层次
有序树和无序树:如果将树中结点各子树看成是从左到右有次序的,称之有序,否则无序。
- 树的遍历:
- Huffman树:
一个无序数列,取这个数列中最小的两个数相加,和替代原来数组中原来这两个数,并作为二叉树中一个结点以及结点的两个孩子,不断重复这个过程,直到最后 构成一棵唯一的二叉树。
Ex:HDU 1710、HDU 1053
- 并查集:
由“并”和“查”组成。
- find(); //查。查找某个元素的根(root)元素是谁,返回根元素的值。
- merge(); //并。如果查(find)出的根(root)元素相同,说明有联系,将有联系的元素并到一个集合中。
Ex:HDU 1232 //这道题就是求最后有几个集合,只要求出来了,就做出来了。
Freecode : www.cnblogs.com/yym2013