数据结构是计算机科学中的基础,它们为解决各种问题提供了强大的工具。本文将深入介绍常见的数据结构,包括数组和链表、栈和队列、树与二叉树、哈希表、图的表示和遍历、并查集,以及Trie树,并附带完整的Java代码示例。
数组和链表是线性数据结构,用于存储一系列元素。数组是一块连续的内存区域,而链表中的元素通过指针链接。
// 示例:数组
int[] array = {1, 2, 3, 4, 5};
// 示例:链表
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
栈和队列是常用的线性数据结构,用于实现特定的操作顺序。栈的特点是先进后出,队列的特点是先进先出。
// 示例:栈
import java.util.Stack;
Stack stack = new Stack<>();
stack.push(1);
stack.push(2);
int top = stack.pop(); // 弹出2
// 示例:队列
import java.util.LinkedList;
import java.util.Queue;
Queue queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
int front = queue.poll(); // 弹出1
树是一种层次结构,常用于表示分层数据。二叉树是一种特殊的树,每个节点最多有两个子节点。
平衡二叉树是一种特殊的二叉搜索树,每个节点的左右子树高度差不超过1,以保证查找的高效性。
红黑树是一种自平衡二叉搜索树,通过调整节点颜色和旋转操作来维持平衡性。
堆是一种特殊的树结构,常用于优先队列等场景。最小堆保证父节点小于等于子节点,最大堆保证父节点大于等于子节点。
// 示例:最小堆
import java.util.PriorityQueue;
PriorityQueue minHeap = new PriorityQueue<>();
minHeap.offer(3);
minHeap.offer(1);
int min = minHeap.poll(); // 弹出1
哈希表是一种使用哈希函数将键映射到值的数据结构,实现了高效的插入和查找操作。
// 示例:哈希表
import java.util.HashMap;
HashMap hashMap = new HashMap<>();
hashMap.put("apple", 10);
int value = hashMap.get("apple"); // 获取值10
图是由节点和边组成的数据结构,用于表示各种关系。图的遍历方式有深度优先遍历(DFS)和广度优先遍历(BFS)。
// 示例:图的表示和遍历
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Graph {
int vertices;
ArrayList> adjacencyList;
Graph(int vertices) {
this.vertices = vertices;
adjacencyList = new ArrayList<>(vertices);
for (int i = 0; i < vertices; i++) {
adjacencyList.add(new ArrayList<>());
}
}
void addEdge(int source, int destination) {
adjacencyList.get(source).add(destination);
}
void DFS(int startVertex, boolean[] visited) {
visited[startVertex] = true;
System.out.print(startVertex + " ");
for (int neighbor : adjacencyList.get(startVertex)) {
if (!visited[neighbor]) {
DFS(neighbor, visited);
}
}
}
void BFS(int startVertex) {
boolean[] visited = new boolean[vertices];
Queue queue = new LinkedList<>();
visited[startVertex] = true;
queue.offer(startVertex);
while (!queue.isEmpty()) {
int vertex = queue.poll();
System.out.print(vertex + " ");
for (int neighbor : adjacencyList.get(vertex)) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.offer(neighbor);
}
}
}
}
}
public class GraphTraversalExample {
public static void main(String[] args) {
int vertices = 4;
Graph graph = new Graph(vertices);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 2);
graph.addEdge(2, 0);
graph.addEdge(2, 3);
graph.addEdge(3, 3
);
System.out.println("深度优先遍历:");
boolean[] visited = new boolean[vertices];
graph.DFS(2, visited);
System.out.println("\n广度优先遍历:");
graph.BFS(2);
}
}
并查集是一种用于处理不相交集合的数据结构,支持合并和查询操作。
// 示例:并查集
class DisjointSet {
int[] parent;
DisjointSet(int size) {
parent = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootX] = rootY;
}
}
}
public class DisjointSetExample {
public static void main(String[] args) {
int size = 5;
DisjointSet ds = new DisjointSet(size);
ds.union(0, 2);
ds.union(4, 2);
System.out.println("0 和 4 是否连通:" + (ds.find(0) == ds.find(4)));
}
}
Trie树是一种用于存储关联数组(键值对)的树结构,常用于字符串检索。
// 示例:Trie树
class TrieNode {
TrieNode[] children = new TrieNode[26];
boolean isEndOfWord;
}
class Trie {
TrieNode root = new TrieNode();
void insert(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (node.children[index] == null) {
node.children[index] = new TrieNode();
}
node = node.children[index];
}
node.isEndOfWord = true;
}
boolean search(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (node.children[index] == null) {
return false;
}
node = node.children[index];
}
return node.isEndOfWord;
}
}
public class TrieTreeExample {
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("apple");
System.out.println("包含 apple:" + trie.search("apple"));
System.out.println("包含 app:" + trie.search("app"));
}
}
本文深入介绍了常见的数据结构和算法,包括数组和链表、栈和队列、树与二叉树、哈希表、图的表示和遍历、并查集,以及Trie树。每个数据结构都有自己的特点和应用场景,通过理解和应用它们,您将能够更好地解决各种问题。