对于任何数据结构,基本操作就是 遍历+访问(增删改查)
各种数据结构的遍历和访问两种形式:线性的和非线性的
一、线性形式
以 for/while 迭代为代表
数组遍历框架,是典型的线性迭代结构
void traverse(int[] arr){
for (int i =0;i<arr.length;i++){
//迭代访问 arr[i]
}
}
链表遍历框架,兼具迭代和递归结构
迭代结构:
/* 基本的单链表节点 */
class ListNode {
int val;
ListNode next;
}
void traverse(ListNode head) {
for (ListNode p = head; p != null;p = p.next) {
//迭代访问p.val
}
}
二、非线性形式
链表遍历框架,递归结构:
/* 基本的单链表节点 */
class ListNode {
int val;
ListNode next;
}
void traverse(ListNode head) {
// 递归访问 head.val
traverse(ListNode head.next) // 访问链表中的下一个节点
}
二叉树遍历框架,是典型的非线性递归遍历结构
二叉树的结构定义:
/* 基本的二叉树节点 */
class TreeNode {
int val;
TreeNode left,right;
}
二叉树的递归遍历:
void traverse (TreeNode root){
traverse(root.left);
traverse(root.right);
}
N叉树的遍历:
/* 基本的N叉树节点 */
class ListNode {
int val;
TreeNode[] children;
}
void traverse(TreeNode root) {
for (TreeNode child : root.childern)
traverse(child);
}