%%%%%%
字符串模式匹配算法--详解KMP算法
https://blog.youkuaiyun.com/zc474235918/article/details/40474525
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
%%%%%%
树的定义和基本术语
其实是一个递归的定义。每个有限集也是一个树。
树的抽象数据类型ADT
数据对象D:具有相同特征的数据元素的集合
数据关系R:
其他表示方法:
集合的圆圈方法、层次的目录
二叉树
左右之分。有序树。
完全二叉树 节点数为10 的话,必须连续的1-10,中间不能断。
性质4中log为向下取整。
顺序结构:对满二叉树比较好。 非完全二叉树,没有元素就为空。空间浪费。
链域:就是地址
空链域就是没有孩子的地址。
n个节点有2n个链域。 有n-1个分支,每个分支就是一个地址,就是一个链域。2n-(n-1)=n+1个空链域。
遍历二叉树
先序就是先根。
遍历都是递归的思想。
上面:
函数指针作为函数参数传递:https://www.cnblogs.com/jainszhang/p/10704514.html
二叉链表的存储形式
栈的数据结构实现中序遍历:
和下面先序只是访问元素的时机不同。其他都相同。VIsit函数位置不同。
先序是入栈的时候就访问根节点。 中序是出栈的时候才访问节点。
线索二叉树
二叉树为非线性结构 用一种方法 让它线性化
线性序列 按照某一种遍历的方法 排列成一个顺序。
n个节点,肯定有n-1个分叉,有n-1个节点有唯一双亲,1个根节点没有双亲。
有2n个链域,所以2n-(n-1)个空链域。所以有n+1个空链域。
a + b * - - - - e / f
线索化的目的是给空的链域 变为 非空。 可以通过中序、先序等方法来实现线索化。
层次遍历:
树和森林
数组下标为双亲的位置。
数组存放data和右边一个指针域,为一个单链表,下标指向孩子的位置
孩子双亲表示法:
左边为双亲位置,右边为孩子位置,感觉这个图和上面二叉树的图不对应。
孩子兄弟表示法:
森林和二叉树的对应关系:
树和森林的遍历
下面一个例题很不错:
哈夫曼树以及其应用
注意:叶子节点是最外面的节点,度为0。
中间的叫分支节点。
权值作为叶子节点构造哈夫曼树。
简单的说就是不断找当前最小权值的两个树。
n个叶子节点。剩下节点为n-1个。共有2n-1个节点。为严格二叉树。
哈夫曼编码:左孩子为0,右边为1