数据结构种类很多,但它们存在的目的都是在不同的应用场景,尽可能高效地增删查改。
各种数据结构的遍历+访问无非两种方式:
- 线性。以
for/while迭代为代表。 - 非线性。以 递归 为代表。
数据遍历框架,典型的线性迭代结构:
void traverse(int[] arr) {for (int i = 0; i < arr.length; i++) {}}
链表遍历框架,兼具迭代和递归结构:
void traverse(ListNode head) {
traverse(head.next());
}
二叉树遍历框架,典型的非线性递归遍历结构:
void traverse(TreeNode root) {
traverse(root.left);
traverse(root.right);
}
N 叉树遍历框架:
void traverse(TreeNode root) {
for (TreeNode child : root.children) {
traverse(child);
}
}
N 叉树的遍历又可以扩展为图的遍历,因为图就是好⼏ N 叉棵树的结合体。你说图是可能出现环的?这个很好办,用个布尔数组 visited 做标记就行了。
