1、栈
-
特点:后进先出,先进后出(一端开口的水管,或子弹弹夹)
-
一端开口(栈顶),一段封闭(栈底)
-
数据进入栈模型的过程:压/进栈 数据离开栈模型的的过程:弹/出栈
2、队列
-
特点:先进先出,后进后出(两端开口的水管)
-
一端开口(后端),另一端开口(前端)
-
数据从后端进入队列模型:入队列 数据从前端离开队列模型:出队列
3、数组
-
特点:数组是一种查询快,增删慢的数据模型
-
查询速度快:通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续存储的)
-
删除效率低:要将原始的数据删除,同时后面每个数据前移
-
添加效率低:添加位置的每个数据后移,在添加元素
4、链表
链表;
节点(链表中的每一个元素)
节点内存储具体的数据和下一个节点的地址值
-
特点:链表中的节点是独立的对象在内存中是不连续的,每个节点包含数据值和下一个地址值
-
链表查询慢:无论查询哪个数据都要从头开始查
-
链表增删相对快(相对于数组)
双向链表相对于单向链表,查询会更快,在查询第N个元素的时候,先判断距离头节点较近还是距离尾节点较近,然后再从头向后或从后向前查询
5、树
树:
度:每一个节点的子节点数量(二叉树,任意节点的度<=2)
树高:树的 总层数
根节点:最顶层的节点
左子节点:左下方的节点
右子节点:右下方的节点
根节点的左子节树,根节点的右子节树
节点内部结构:
(若一个节点没有父节点或子节点就记为null)
5.1 二叉查找(排序/搜索)树
特点:
每一个节点上最多有两个子节点
任意节点左子树上的值都小于当前节点
任意节点右子树上的 值都大于当前节点
规则:小的存左边,大的村右边,一样的不存
弊端:节点左右字树的树高可能差距较大
5.2 二叉树的遍历方式
前序遍历:
从根节点开始,然后按照当前节点,左子节点,右子节点的顺序遍历
中序遍历(最为重要且常用):
从最左边的节点开始,然后按照左子节点,当前节点,右子节点的顺序遍历
后序遍历:
从最最左边的节点开始,然后按照左子节点,右子节点,当前节点的顺序遍历
层序遍历:
从根节点开始一层一层的遍历
5.3 平衡二叉树
规则:任意节点左右字树的高度查不超过1
旋转机制:(触发时机:当添加一个节点后,该树不在为一个平衡二叉树)
-
左旋:
确定支点:从添加的节点开始,不断的往父节点找不平衡的节点
步骤:以不平衡的点作为支点
把支点左旋降级,变成左子节点
晋升原来的右子节点
-
右旋
确定支点:从添加的节点开始,不断的往父节点找不平衡的节点
步骤:以不平衡的点作为支点
把支点右旋降级,变成右子节点
晋升原来的左子节点
(弊端 : 添加节点的时间浪费)
5.4 红黑树
一种特殊的二叉查找树,红黑树的每一个节点都有存储位表示节点的颜色
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过”红黑规则“进行实现的
红黑规则:
添加节点的规则:
默认颜色:添加的节点默认是红色的(效率高)
红黑树增删改查的性能都很好