程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 算法思想

  • 刷题笔记

    • 数组基础
    • 遍历框架
      • 数组系列
      • 链表系列
      • 哈希表系列
      • 字符串系列
      • 栈与队列系列
      • 深入理解二叉树
    • 面试常见问题

    • 面试
    • 刷题笔记
    scholar
    2024-01-18
    目录

    遍历框架

    对于任何数据结构,其基本操作无非遍历 + 访问,再具体一点就是:增删查改。

    如何遍历 + 访问?我们从最高层来看,各种数据结构的遍历 + 访问无非两种形式:线性的和非线性的。

    线性就是 for/while 迭代为代表,非线性就是递归为代表。再具体一步,无非以下几种框架:

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

    // for循环用来遍历数组
    void traverse1(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            // 访问数组元素 arr[i]
            // 在这里可以对数组元素 arr[i] 进行操作
        }
    }
    // while循环遍历数组
    void traverse2(int[] arr) {
        int i = 0; 
        while (i < arr.length) {
            // 访问数组元素 arr[i]
            // 在这里可以对数组元素 arr[i] 进行操作
            i++; // 索引递增
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

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

    img

    /* 基本的单链表节点 */
    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { this.val = x; }
    }
    
    class Solution {
        // 迭代遍历
        void traverse(ListNode head) {
            // p 用来遍历链表,初始指向链表的头节点
            for (ListNode p = head; p != null; p = p.next) {
                // 这里是迭代访问 p.val 的位置
                // 在这里可以进行一些操作,比如打印节点值等
                // System.out.println(p.val);
            }
        }
    
        // 递归遍历
        void traverse(ListNode head) {
            // 递归终止条件
            if (head == null) return;
            // 这里是递归访问 head.val 的位置
            // 在这里可以进行一些操作,比如打印节点值等
            // System.out.println(head.val);
    
            // 递归访问下一个节点
            traverse(head.next);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    # 二叉树遍历框架,典型的非线性递归遍历结构:

    img

    /* 基本的二叉树节点 */
    class TreeNode {
        int val;
        TreeNode left, right;
        TreeNode(int x) { this.val = x; }
    }
    
    class Solution {
        void traverse(TreeNode root) {
            if (root == null) return; // 递归边界条件
            
            // 前序位置 - 在遍历左子树之前处理当前节点
            // 这里可以添加处理逻辑,比如打印 root.val 等
            // System.out.println("Pre-order: " + root.val);
    
            traverse(root.left);  // 遍历左子树
    
            // 中序位置 - 在遍历左子树之后、右子树之前处理当前节点
            // 对于二叉搜索树,这个位置的遍历会按升序访问节点
            // System.out.println("In-order: " + root.val);
    
            traverse(root.right); // 遍历右子树
    
            // 后序位置 - 在遍历完左右子树之后处理当前节点
            // 常用于后续清理或计算工作,比如删除节点或计算子树信息
            // System.out.println("Post-order: " + root.val);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    # 二叉树框架可以扩展为 N 叉树的遍历框架:

    /* 基本的 N 叉树节点 */
    class TreeNode {
        int val;
        List<TreeNode> children; // 使用列表存储所有子节点
    }
    
    void traverse(TreeNode root) {
        if (root == null) return; // 递归边界条件
        
        // process current node 
        // 处理当前节点逻辑(如果有需要)...
    
        // 遍历每个子节点
        for (TreeNode child : root.children)
            traverse(child);  // 递归地遍历每个子节点
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    编辑此页 (opens new window)
    上次更新: 2025/01/02, 01:21:04
    数组基础
    数组系列

    ← 数组基础 数组系列→

    Theme by Vdoing | Copyright © 2019-2025 程序员scholar
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式