常见的数据结构:栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树。
一、栈
栈特点:先进后出,后进先出
Java中有一块栈内存,执行的方法按照栈特点存放。
二、队列
栈和队列对比:
三、数组
数组是一种查询快,增删慢的模型。
四、链表
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
弊端:链表查询慢,无论查询哪个数据都要从头开始。
优点:链表增删相对快(相对数组 )。
双向链表在查询第N个元素时效率比单向链表高。
总结:
五、树
每个节点保存以下数据:
度:每一个节点子节点的数量。
任意节点度<=2,就是二叉树。
二叉树:
在一个二叉树中,左节点比自己小,有节点比自己大,称为二叉查找树 (二叉排序树或者二叉搜索树)。
特点:
1、每个节点上最多有两个子节点;
2、任意节点左子树上的值都小于当前节点;
3、任意节点右子树上的值都大于当前节点。
二叉查找树添加节点规则:
小的存左边,大的存右边,一样的不存。
二叉树的遍历方式:前序遍历、中序遍历、后序遍历、层序遍历
(1)前序遍历
(2)中序遍历
(3) 后序遍历
(4)层序遍历
小结:
二叉查找树弊端:容易左子树和右子树树高相差过大,导致查询效率低下
平衡二叉树:
平衡二叉树如何保证平衡?
因为平衡二叉树的旋转机制 :左旋、右旋,触发时机:当添加一个节点后,该树不再是平衡二叉树时触发旋转机制。
左旋:
当触发旋转机制时,首先确定支点:从添加的节点开始,不断往父节点找不平衡的点。
然后:
1、以不平衡的点作为支点
2、把支点左旋降级,变成左子结点,如果支点是根节点,则把根节点得到右侧往左拉
3、晋升原来的右子节点,如果右子节点有自己的左子结点,则让出左子结点给降级的根节点当做右子节点
右旋:
同理,先找支点,然后:
1、以不平衡的点作为支点
2、把支点右旋降级,变成右子结点,如果支点是根节点,则把根节点得到左侧往右拉
3、晋升原来的左子节点,如果左子节点有自己的右子结点,则让出右子结点给降级的根节点当做左子节点
不平衡的四种情况:
(1)左左
(2)左右
先局部左旋,再右旋
(3)右右
(4)右左
先局部右旋,再左旋
六、红黑树
红黑树和平衡二叉树的区别:
红黑规则:
红黑树添加节点规则:
红黑树增删改查性能都很好。