树是一种抽象数据类型(ADT)或是实作这种抽象类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。

树的特点

1.每个节点有零个或多个子节点;

2.没有父节点的节点成为根节点;

3.每一个非根节点有且只有一个父节点;

4.除了根节点外,每个子节点可以分为多个不相交的子树。

树的分类

无序树:树中任意节点的子节点之间没有顺序关系,这种树成为无序树,也称为自由树;

有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;

有序树分为

一、二叉树:每个节点最多含有两个子树的树,称为二叉树;

二叉树分为:

1.完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其他各层节点数目均已经达到最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树称为完全二叉树

满二叉树:在完全二叉树的基础上,第d层的节点数目也达到最大值。

2.平衡二叉树(AVL树):当且仅当任意节点的两颗子树的高度差不大于1的二叉树;

3.排序二叉树(二叉查找树):也成为二叉搜索树、有序二叉树;

二、霍夫曼树(用于信息编码):带权路径最短的二叉树称为霍夫曼树或最优二叉树;(压缩技术也使用到了霍夫曼树)

三、B树(B++树):一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树

树的存储

顺序存储:将数据结构存储在固定的数组中,虽然在遍历速度上有一定优势,但因为所占空间比较大,是非主流二叉树。

链式存储:是主流的二叉树存储方式,缺陷究竟是指针或指针个数不定(即子节点数不确定),解决方案:把多叉树转成二叉树。

树的应用场景(一般不用来存数据,而是用来辅助计算)

1.xml,html等,编写这些东西的解析器的时候,不可避免用到树,比如html为根节点,下面两个子节点是head和body,其中head这个节点下面又分出两个节点meta和title,body下面分出多个节点,比如h1标签,h2标签,ul标签等。

2.路由协议(路由的转发)是使用了树的算法

3.mysql 数据库索引使用的是B++树的结构去存储

4.文件系统的目录结构

5.AI算法其实就是树搜索,机器学习中的decision tree也是树结构,类似人脑,去买东西,分为去楼下买东西和去超市买东西,去超市买东西下一步又分为打滴滴去买和坐公交去买

 

posted @ 2018-12-25 17:34  Gnbp  阅读(149)  评论(0编辑  收藏  举报