数据结构
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出。
一、线性表 1.数组实现 2.链表二、栈与队列三、树与二叉树 1.树 2.二叉树基本概念 3.二叉查找树 4.平衡二叉树 5.红黑树四、图五、总结一、线性表
数组实现
- 代码1 创建一个更大的数组来替换当前数组
int[] oldArray = new int[10];int[] newArray = new int[20];for (int i = 0; i < oldArray.length; i++) { newArray = oldArray;}// 也可以使用System.arraycopy方法来实现数组间的复制 // System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);oldArray = newArray;
- 代码2 在数组位置index上添加元素e
//oldArray 表示当前存储元素的数组//size 表示当前元素个数public void add(int index, int e) { if (index > size || index < 0) { System.out.println("位置不合法..."); } //如果数组已经满了 就扩容 if (size >= oldArray.length) { // 扩容函数可参考代码1 } for (int i = size - 1; i >= index; i--) { oldArray[i + 1] = oldArray; } //将数组elementData从位置index的所有元素往后移一位 // System.arraycopy(oldArray, index, oldArray, index + 1,size - index); oldArray[index] = e; size++;}
链表
单链表的结构
- 代码3 链表的节点
class Node<E> { E item; Node<E> next; //构造函数 Node(E element) { this.item = element; this.next = null; }}
- 代码4 定义好节点后,使用前一般是对头节点和尾节点进行初始化
//头节点和尾节点都为空 链表为空Node<E> head = null;Node<E> tail = null;
- 代码5 空链表创建一个新节点
//创建一个新的节点 并让head指向此节点head = new Node("nodedata1");//让尾节点也指向此节点tail = head;
- 代码6 链表追加一个节点
//创建新节点 同时和最后一个节点连接起来tail.next = new Node("node1data2");//尾节点指向新的节点tail = tail.next;
- 代码7 顺序遍历链表
Node<String> current = head;while (current != null) { System.out.println(current.item); current = current.next;}
- 代码8 倒序遍历链表
static void printListRev(Node<String> head) {//倒序遍历链表主要用了递归的思想 if (head != null) { printListRev(head.next); System.out.println(head.item); }}
- 代码 单链表反转
//单链表反转 主要是逐一改变两个节点间的链接关系来完成static Node<String> revList(Node<String> head) { if (head == null) { return null; } Node<String> nodeResult = null; Node<String> nodePre = null; Node<String> current = head; while (current != null) { Node<String> nodeNext = current.next; if (nodeNext == null) { nodeResult = current; } current.next = nodePre; nodePre = current; current = nodeNext; } return nodeResult;}
二、栈与队列
栈
栈的模型
关于栈的一道经典题目
队列
队列示意图
- 代码9 简单实现队列类
public class MyQueue<E> { private LinkedList<E> list = new LinkedList<>(); // 入队 public void enqueue(E e) { list.addLast(e); } // 出队 public E dequeue() { return list.removeFirst(); }}
三、树与二叉树
树
树的结构
二叉树基本概念
- 定义
- 相关性质
- 三种遍历方法
给定二叉树写出三种遍历结果
- 树和二叉树的区别
二叉查找树
- 定义
典型的二叉查找树的构建过程
- 性能分析
不同形态平衡二叉树的ASL不同
- 代码10 二叉树的节点
class TreeNode<E> { E element; TreeNode<E> left; TreeNode<E> right; public TreeNode(E e) { element = e; }}
- 代码12 先序遍历
protected void preorder(TreeNode<E> root) { if (root == null) return; System.out.println(root.element + " "); preorder(root.left); preorder(root.right);}
- 代码13 中序遍历
protected void inorder(TreeNode<E> root) { if (root == null) return; inorder(root.left); System.out.println(root.element + " "); inorder(root.right);}
- 代码14 后序遍历
protected void postorder(TreeNode<E> root) { if (root == null) return; postorder(root.left); postorder(root.right); System.out.println(root.element + " ");}
- 代码15 二叉查找树的简单实现
/** * @author JackalTsc */public class MyBinSearchTree<E extends Comparable<E>> { // 根 private TreeNode<E> root; // 默认构造函数 public MyBinSearchTree() { } // 二叉查找树的搜索 public boolean search(E e) { TreeNode<E> current = root; while (current != null) { if (e.compareTo(current.element) < 0) { current = current.left; } else if (e.compareTo(current.element) > 0) { current = current.right; } else { return true; } } return false; } // 二叉查找树的插入 public boolean insert(E e) { // 如果之前是空二叉树 插入的元素就作为根节点 if (root == null) { root = createNewNode(e); } else { // 否则就从根节点开始遍历 直到找到合适的父节点 TreeNode<E> parent = null; TreeNode<E> current = root; while (current != null) { if (e.compareTo(current.element) < 0) { parent = current; current = current.left; } else if (e.compareTo(current.element) > 0) { parent = current; current = current.right; } else { return false; } } // 插入 if (e.compareTo(parent.element) < 0) { parent.left = createNewNode(e); } else { parent.right = createNewNode(e); } } return true; } // 创建新的节点 protected TreeNode<E> createNewNode(E e) { return new TreeNode(e); }}// 二叉树的节点class TreeNode<E extends Comparable<E>> { E element; TreeNode<E> left; TreeNode<E> right; public TreeNode(E e) { element = e; }}
- 二叉查找树中删除节点分析
- current节点没有左孩子,那么只需要将patent节点和current节点的右孩子相连。
- current节点有一个左孩子,假设rightMost指向包含current节点的左子树中最大元素的节点,而parentOfRightMost指向rightMost节点的父节点。那么先使用rightMost节点中的元素值替换current节点中的元素值,将parentOfRightMost节点和rightMost节点的左孩子相连,然后删除rightMost节点。
// 二叉搜索树删除节点 public boolean delete(E e) { TreeNode<E> parent = null; TreeNode<E> current = root; // 找到要删除的节点的位置 while (current != null) { if (e.compareTo(current.element) < 0) { parent = current; current = current.left; } else if (e.compareTo(current.element) > 0) { parent = current; current = current.right; } else { break; } } // 没找到要删除的节点 if (current == null) { return false; } // 考虑第一种情况 if (current.left == null) { if (parent == null) { root = current.right; } else { if (e.compareTo(parent.element) < 0) { parent.left = current.right; } else { parent.right = current.right; } } } else { // 考虑第二种情况 TreeNode<E> parentOfRightMost = current; TreeNode<E> rightMost = current.left; // 找到左子树中最大的元素节点 while (rightMost.right != null) { parentOfRightMost = rightMost; rightMost = rightMost.right; } // 替换 current.element = rightMost.element; // parentOfRightMost和rightMost左孩子相连 if (parentOfRightMost.right == rightMost) { parentOfRightMost.right = rightMost.left; } else { parentOfRightMost.left = rightMost.left; } } return true; }
平衡二叉树
平衡二叉树
红黑树
四、图
- 简介
- 相关阅读
(2) 《数据结构之图(存储结构、遍历)》
五、总结
更多免费技术资料可关注:annalin1203