数组
- 数组的特性
- 存储空间是连续的
- 长度是不可变的
- 只能存储 相同的类型(不严谨)
- 可以通过下标访问数组的内容 a[10] 复杂度是O1
- 每个元素的默认是为'零'值 0 null false -> 一个对象的基本的数据域的初始化也是这样的
- Student 类中的username属性 默认值
链表
-
查找麻烦
-
插入和删除简单
-
可以定点删除和插入
-
非连续的
-
无限定长度
-
节点 类 结构体
-
删除是用指针指向其他的节点
-
线程不安全
-
查询效率不好 On
栈
先进后出
队列
先进先出
两个队列实现栈
import java.util.LinkedList;
import java.util.Queue;public class MyStack {Queue<Integer> queue1 = new LinkedList<>();Queue<Integer> queue2 = new LinkedList<>();public MyStack() {}public void push(int x) {queue2.add(x);while (!queue1.isEmpty()) {queue2.add(queue1.remove());}// 交换队列引用Queue<Integer> temp = queue2;queue2 = queue1;queue1 = temp;}public int pop() {return queue1.remove();}public int top() {if (queue1.isEmpty()){return 0;}return queue1.peek();}public boolean empty() {return queue1.isEmpty();}public static void main(String[] args) {MyStack myStack = new MyStack();myStack.push(1);myStack.push(2);myStack.push(3);System.out.println(myStack.pop());System.out.println(myStack.pop());System.out.println(myStack.pop());}}
两个栈实现队列
import java.util.Stack;public class MyQueue {Stack<Integer> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();public MyQueue() {}public void push(int x) {stack1.push(x);}public int pop() {if (stack2.isEmpty()){inOut();}return stack2.pop();}public int peek() {if (stack2.isEmpty()){inOut();}return stack2.peek();}public boolean empty() {return stack1.isEmpty() && stack2.isEmpty();}public void inOut(){while (!stack1.isEmpty()){stack2.push(stack1.pop());}}public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.push(2);myQueue.push(9);myQueue.push(8);int result = myQueue.pop();int result2 = myQueue.peek();System.out.println(result);System.out.println(result2);}
}
list
hashmap
多叉树
二叉树
- 每个节点最多拥有两个子节点
- 每个节点最多有一个父节点
- 只有一个根节点
- 遍历
- 前序遍历
- 中序遍历
- 后序遍历
- 层次遍历
搜索二叉树
- 左边比根小
- 右边比根大
- 查找时间 最优 Ologn ~ On 不太稳定
class TreeQueue<F> {private F[] arr = (F[]) new Object[10];private int addindex = 0;private int getindex = 0;public void add(F x) {if(addindex - getindex == arr.length) {//判断是否满了F[] arr2 = (F[]) new Object[arr.length * 2];for(int i = getindex; i < addindex; i++) {arr2[ i % arr2.length ] = arr[i% arr.length ];}arr = arr2;}arr[addindex%arr.length] = x;addindex++;}public F get() {if(addindex == getindex) {//判断是否满了return null;}else {F x = arr[getindex%arr.length];getindex++;return x;}}
}public class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int x) {val = x;}public String toString() {return " 树的节点是:"+val;}public static void add(TreeNode x,int val) {if(val>x.val) {if(x.right == null) {TreeNode temp = new TreeNode(val);x.right = temp;}else {add(x.right,val);}}else {if(x.left == null) {TreeNode temp = new TreeNode(val);x.left = temp;}else {add(x.left,val);}}}public static void zhongxuprint(TreeNode x) {if(x.left!=null) {qianxuprint(x.left);}System.out.print(x.val+" ");if(x.right!=null) {qianxuprint(x.right);}}public static void qianxuprint(TreeNode x) {System.out.print(x.val+" ");if(x.left!=null) {qianxuprint(x.left);}if(x.right!=null) {qianxuprint(x.right);}}public static void houxuprint(TreeNode x) {if(x.left!=null) {qianxuprint(x.left);}if(x.right!=null) {qianxuprint(x.right);}System.out.print(x.val+" ");}public static void cengxuprint(TreeNode root) {TreeQueue<TreeNode> que = new TreeQueue<>();que.add(root);while(true) {TreeNode x = que.get();if(x!=null) {System.out.print(x.val+" ");if(x.left!=null) {que.add(x.left);}if(x.right!=null) {que.add(x.right);}}else {break;}}}public static void search(TreeNode root,int x) {if(x == root.val) {System.out.println("找到了"+root.val);return;}if(x > root.val) {if(root.right==null) {System.out.println("木有这个值");}else {search(root.right,x);}}else {if(root.left==null) {System.out.println("木有这个值");}else {search(root.left,x);}}}
}
平衡二叉树
- 旋转 如何旋转 如何平衡
- 最小不平衡子树
- LL型
- LR型
- 任何一个节点 左右子树高度差不超过1
- RR型
- RL型自己画一下
红黑树
- 近似的平衡二叉查找树
- 要么是红的要么是黑的
- 叶子节点nil节点是黑的
- 根节点是黑的 心是一个黑心呀
- 节点会变色
- 红色节点的子节点一定是黑的 不能两个连续的红色节点
- 任意一个节点 到任何一个叶子的路径 是具有相同数目的黑色节点的
关于红黑树(R-B tree)原理,看这篇如何 - 工匠初心 - 博客园
b-树
image-20200727175514447
b+树
image-20200727175531655
- mysql的底层实现 存储结构
- 索引