二叉树的中序遍历和后序遍历的递归与非递归代码示例

简介: 二叉树的中序遍历和后序遍历的递归与非递归代码示例

以下是二叉树中序遍历和后序遍历的递归与非递归代码示例:

中序遍历:

递归实现:

class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
   
        this.val = val;
    }
}

public class BinaryTreeTraversalExample {
   

    public static void inOrderTraversal(TreeNode root) {
   
        if (root == null) {
   
            return;
        }
        inOrderTraversal(root.left);
        System.out.print(root.val + " ");
        inOrderTraversal(root.right);
    }

    public static void main(String[] args) {
   
        // 构建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 执行中序遍历
        inOrderTraversal(root);
    }
}

非递归实现(使用栈):

class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
   
        this.val = val;
    }
}

public class BinaryTreeTraversalExample {
   

    public static void inOrderTraversalNonRecursive(TreeNode root) {
   
        if (root == null) {
   
            return;
        }

        Stack<TreeNode> stack = new Stack<>();
        TreeNode curr = root;

        while (!stack.isEmpty() || curr!= null) {
   
            if (curr!= null) {
   
                stack.push(curr);
                curr = curr.left;
            } else {
   
                curr = stack.pop();
                System.out.print(curr.val + " ");
                curr = curr.right;
            }
        }
    }

    public static void main(String[] args) {
   
        // 构建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 执行中序遍历
        inOrderTraversalNonRecursive(root);
    }
}

后序遍历:

递归实现:

class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
   
        this.val = val;
    }
}

public class BinaryTreeTraversalExample {
   

    public static void postOrderTraversal(TreeNode root) {
   
        if (root == null) {
   
            return;
        }
        postOrderTraversal(root.left);
        postOrderTraversal(root.right);
        System.out.print(root.val + " ");
    }

    public static void main(String[] args) {
   
        // 构建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 执行后序遍历
        postOrderTraversal(root);
    }
}

非递归实现(使用两个栈):

class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
   
        this.val = val;
    }
}

public class BinaryTreeTraversalExample {
   

    public static void postOrderTraversalNonRecursive(TreeNode root) {
   
        if (root == null) {
   
            return;
        }

        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();

        s1.push(root);

        while (!s1.isEmpty()) {
   
            TreeNode curr = s1.pop();
            s2.push(curr);

            if (curr.left!= null) {
   
                s1.push(curr.left);
            }
            if (curr.right!= null) {
   
                s1.push(curr.right);
            }
        }

        while (!s2.isEmpty()) {
   
            System.out.print(s2.pop().val + " ");
        }
    }

    public static void main(String[] args) {
   
        // 构建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 执行后序遍历
        postOrderTraversalNonRecursive(root);
    }
}
相关文章
|
前端开发
vue3 中wangEditor富文本编辑器上传图片功能
vue3 中wangEditor富文本编辑器上传图片功能
1497 0
|
8月前
|
监控 关系型数据库 MySQL
索引失效场景(阿里高频踩坑点)
MySQL索引可显著提升查询性能,但存在多种失效场景:数据类型不匹配、索引列使用函数、LIKE以%开头、复合索引未遵循最左前缀、OR条件中部分无索引、NULL值查询、频繁更新导致索引失衡、ORDER BY/GROUP BY未用索引列、配置或版本差异及过度依赖索引。阿里等大厂高频踩坑点需特别警惕。合理设计索引并结合执行计划优化,才能保障高效查询。(238字)
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
1524 3
|
消息中间件 存储 Kafka
10倍降本、10倍无损弹性!Kafka Serverless 基础版与专业版重磅发布!
云消息队列 Kafka 版基于 Apache Kafka 构建,提供高吞吐量与高可扩展性的分布式消息队列服务,广泛应用于日志收集、监控数据聚合、流式数据处理及在离线分析等场景,是 AI 与大数据时代企业数据处理体系的核心组件。
|
人工智能 边缘计算 5G
边缘智能体:轻量化部署与离线运行
作为一名深耕AI技术多年的博主摘星,我深刻感受到边缘计算与人工智能融合所带来的技术革命。在云计算主导的时代,我们习惯了将复杂的AI推理任务交给强大的云端服务器处理,但随着物联网设备的爆发式增长、5G网络的普及以及对实时性要求的不断提升,边缘智能体(Edge Intelligent Agents)正成为AI技术发展的新趋势。边缘智能体不仅要求在资源受限的边缘设备上高效运行,还需要具备离线推理能力,这对传统的AI部署模式提出了全新的挑战。在我多年的实践中,我发现边缘智能体的核心价值在于将智能决策能力下沉到数据产生的源头,通过模型压缩、量化优化、离线推理等技术手段,实现低延迟、高可靠、隐私保护的智能
1398 0
|
SQL 流计算 关系型数据库
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
阿里云OpenLake解决方案建立在开放可控的OpenLake湖仓之上,提供大数据搜索与AI一体化服务。通过元数据管理平台DLF管理结构化、半结构化和非结构化数据,提供湖仓数据表和文件的安全访问及IO加速,并支持大数据、搜索和AI多引擎对接。本文为您介绍以Flink作为Openlake方案的核心计算引擎,通过流式数据湖仓Paimon(使用DLF 2.0存储)和EMR StarRocks搭建流式湖仓。
1572 5
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
|
监控 Serverless 开发者
开发者如何用好云数据传输CDT
【10月更文挑战第22天】开发者如何用好云数据传输CDT
721 4
|
前端开发 JavaScript API
现代前端框架中的响应式编程实践
现代前端框架中的响应式编程实践
476 0
|
JavaScript 前端开发 开发者
深入浅出 Vue.js:构建响应式前端应用
Vue.js 是一个流行的前端框架,以其简洁、高效和易学著称。它采用响应式和组件化设计,简化了交互式用户界面的构建。本文详细介绍 Vue.js 的核心概念、基本用法及如何构建响应式前端应用,包括实例、模板、响应式数据和组件等关键要素,并介绍了项目结构、Vue CLI、路由管理和状态管理等内容,帮助开发者高效地开发现代化前端应用。
|
存储 Java 区块链
fabric智能合约
fabric智能合约
848 0