数据结构种类很多,但它们存在的目的都是在不同的应用场景,尽可能高效地增删查改。
    各种数据结构的遍历+访问无非两种方式:

    1. 线性。以 for/while 迭代为代表。
    2. 非线性。以 递归 为代表。

    数据遍历框架,典型的线性迭代结构:

    1. void traverse(int[] arr) {
    2. for (int i = 0; i < arr.length; i++) {}
    3. }

    链表遍历框架,兼具迭代和递归结构:

    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 做标记就行了。