資料結構的基本操作不外乎: 遍歷(traverse)、增減查改(CRUD, create, read, update, delete)
- Array:數組的遍歷框架 -> 典型的線性迭代結構:
void traverse(vector<int> arr){
for (int i = 0; i < arr.size(); i++){
// iteration
}
}
- ListNode:鏈表的遍歷框架 -> 兼具迭代與遞迴
class ListNode {
public:
int val;
ListNode* next;
};
void traverse(ListNode* head){
for (ListNode curr = head; curr != NULL; curr = curr->next){
// iteration
}
}
void traverse(ListNode* head){
// recursion
traverse(head->next);
}
由上述兩種基底可推廣至各種結構:
class TreeNode {
public:
int val;
TreeNode* left, right;
};
void traverse(TreeNode* root){
traverse(root->left);
traverse(root->right);
}
class TreeNode {
public:
int val;
vector<TreeNode*> children
}
void traverse(TreeNode* root){
for (TreeNode* child : root->children){
traverse(child);
}
}
- 圖(graph):可視為 N 叉樹的結合體,再利用 visited 處理環(circle)
class Node {
public:
int val;
vector<Node*> neighbors;
}
unordered_set<Node*> visited; // 處理已拜訪過的節點
void traverse(Node* node){
if (visited) return; // 檢查是否拜訪過了
visited.insert(node) // 將現在拜訪的節點標記成已拜訪的節點
for (TreeNode* neighbor : neighbors){
traverse(neighbor)
}
}