当前位置: 首页 > article >正文

【Leetcode Top 100】94. 二叉树的中序遍历

问题背景

给定一个二叉树的根节点 r o o t root root,返回 它的 中序 遍历 。

数据约束

  • 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \le Node.val \le 100 100Node.val100

解题过程

中序遍历,二叉树的基本操作。
递归的方法是先递归左子树,访问当前节点,然后访问右子树即可。
非递归的方法是在左子树非空的情况下,不断地往左子树遍历,沿途用栈来记录节点。一旦左子树为空,那么应当访问当前栈中的第一个节点,接下来处理右子树。

二叉树的遍历,递归与非递归的写法时空复杂度差异不大。一般来说,只要递归的做法能解决问题,就不必特意实现非递归的方式。

具体实现

递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    // 原方法要返回一个列表,不方便递归操作,重新定义一个方法来实现
    private void inorder(TreeNode root, List<Integer> list) {
        // 递归边界是当前节点为空,直接返回
        if(root == null) {
            return;
        }
        inorder(root.left, list); // 递归遍历左子树
        list.add(root.val); // 访问当前节点
        inorder(root.right, list); // 递归遍历右子树
    }
}

非递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        // 只要左子树不为空,就不断地往左子树遍历
        while (!stack.isEmpty() || root != null) {
            if (root != null) {
                stack.push(root); // 沿途节点进栈
                root = root.left; // 工作指针指向左子树
            } else {
                root = stack.pop(); 
                res.add(root.val); // 访问栈中的第一个节点
                root = root.right; // 工作指针指向右子树
            }
        }
        return res;
    }
}

http://www.kler.cn/a/430269.html

相关文章:

  • 功能篇:mybatis中实现缓存
  • 记录一次MySQL:caching_sha2_password报错
  • 备考蓝桥杯:顺序表相关算法题
  • arcgisPro加载CGCS2000天地图后,如何转成米单位
  • 操作手册:集成钉钉审批实例消息监听配置
  • Linux服务器网络不通问题排查及常用命令使用
  • 观察者模式的理解和实践
  • vue的指令
  • Python 网络爬虫进阶:突破数据采集的边界
  • 【金猿CIO展】海博科技总经理兼CIO韩东明:大数据与大模型,驱动智能运维的新引擎...
  • 在Excel中实现选中单元格行列变色的功能
  • 基于SpringBoot实现验证码功能
  • C# WinForm —— 39 40 41 42 DataGridView 介绍与使用
  • k8s 之 Deployment
  • vue vxe-table 实现财务记账凭证并打印
  • Unix、GNU、BSD 风格中 ps 参数的区别
  • git将一个项目的文件放到另一个项目的文件夹下
  • 适配器模式 (Adapter) · 对象适配器 · 类适配器 · 实际开发中的应用
  • 游戏引擎学习第35天
  • 群控系统服务端开发模式-应用开发-邮件发送工具类
  • 【opencv入门教程】3. Rect 类用法
  • 嵌入式学习(15)-stm32通用GPIO模拟串口发送数据
  • 设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计
  • 大舍传媒-关于海外媒体宣发的探讨
  • 【ONE·基础算法 || 动态规划(四)】
  • Hadoop不同版本的区别