复杂数据结构——不是简单的线性表,并且每个数据元素之间也可能存在关系,相关的插入、删除操作不仅对数据元素进行操作,同时还要维护数据元素之间的关系.
1.树:一种表达数据之间层次关系的数据结构.
树的每个节点有0或多个子节点,但是只有一个父节点,父节点为空的节点就是根节点.
树结构的相关概念:
- 树的度:一个节点含有子树的个数称为该节点的度
- 叶节点:度为0的节点称为叶节点
- 根节点
- 树的高度:一棵树的最大层次数就是树的高度
兄弟节点:具有相同父节点的子节点互称为兄弟节点
树是一种没有环路的图
根据每个节点的子节点又可以将树分为二叉树和多叉树
有序的二叉树 = 二叉查找树 = 二叉排序树
特点:- 如果左子树不为空,则左子树上所有节点的值都小于根节点的值
如果右子树不为空,则右子树上所有节点的值都大于根节点的值
二叉查找树的时间复杂度为O(lgn),简单二叉查找树的插入操作都发生在叶节点,如果构造二叉查找树时一次插入的节点已经是有序的,则二叉树会退化为链表形状的单支数.这种情况下,查找操作的事件复杂度变成O(n).为了优化查找效率,就需要二叉查找树能够具有自平衡功能,保证二叉树始终是一颗平衡树.
AVL树和红黑树就是自平衡二叉查找树.二者的区别在于维持树的自平衡的方法不一样.
在算法设计中,只要有条件就应该优先使用AVL树和红黑树,避免简单二叉查找树可能存在的性能问题
二叉查找树在算法中的应用:决策问题(构造决策树)、统计问题、取舍问题
多叉树的典型例子就是B树和各种B树的变形树,B树是一种自平衡多叉查找树. B树常用于文件管理系统和数据库系统. 在算法设计时,如果遇到多路分支且有序的层次结构时,就可以考虑B树
区间树:以区间为数据元素的红黑树,区间树的每个节点都表示一个区间,其关键字是区间的左端点,区间树支持所有的二叉查找树的基本操作,而且区间元素的插入和查找操作都可以在O(lgn)的时间内完成.
区间树常用于区间查询相关的问题,比如判断区间之间是否存在重叠区域等问题.
堆:一种完全树
最大堆:每个节点的值都大于其子树上所有节点的值.
最小堆:每个节点的值都小于其子树上所有节点的值.
利用堆的性质,可以应用在哪些场景?
“求n个数中最大(或最小)的m个数的问题”就是通过维护一个有m个节点的最大堆(最小堆)来实现的
字典树的优点是利用字符串的公共前缀或后缀节约存储空间,查找过程中能减少无谓的完整字符串匹配,便于字符串的统计和查找.