java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历

简介: java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历

本文为博主原创,转载请注明出处:

  目录:

    一。快速理解前序,中序,后序遍历的区别

    二。使用递归的方式实现前序,中序,后序遍历

    三。 使用迭代的方式实现前序 中序 后序遍历

    四。层序遍历

一。快速理解前序,中序,后序遍历的区别

前序遍历:根左右(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )

中序遍历:左根右(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

后序遍历:左右根(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)

参考一张图可以快速理解三种遍历的顺序

                                         

 

 

 

二。使用递归的方式实现前序,中序,后序遍历

package com.example.test.tree;
public class TreeNode {
    // 树的根结点值
    int val;
    // 根节点对应的左节点
    TreeNode left = null;
    // 根节点对应的右节点
    TreeNode right = null;
    public TreeNode(int val){
        this.val = val;
    }
    /**
     * 树的前序便利:根节点--〉左节点---〉右节点
     * @param root
     */
    public static void preOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + "   ");
        preOrder(root.left);
        preOrder(root.right);
    }
    /**
     * 树的中序遍历 : 左节点--〉中节点 --〉 右节点
     * @param root
     */
    public static void middleOrder(TreeNode root){
        if (root ==null){return;}
        middleOrder(root.left);
        System.out.print(root.val+ "   ");
        middleOrder(root.right);
    }
    /**
     * 树的后序遍历: 左节点--〉右节点 --> 根节点
     * @param root
     */
    public static void afterOrder(TreeNode root){
        if (root == null){return;}
        afterOrder(root.left);
        afterOrder(root.right);
        System.out.print(root.val+ "   ");
    }
    public static void main(String[] args) {
        TreeNode root = new TreeNode(20);
        TreeNode node1 = new TreeNode(4);
        TreeNode node2 = new TreeNode(5);
        TreeNode node3 = new TreeNode(8);
        TreeNode node4 = new TreeNode(2);
        TreeNode node5 = new TreeNode(7);
        TreeNode node6 = new TreeNode(12);
        TreeNode node7 = new TreeNode(3);
        TreeNode node8 = new TreeNode(9);
        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        node3.left = node7;
        node4.right = node8;
        preOrder(root);
        System.out.println();
        middleOrder(root);
        System.out.println();
        afterOrder(root);
    }
}

 

三。 使用迭代的方式实现前序 中序 后序遍历

package com.example.test.tree;
import java.util.Stack;
public class TreeNode {
    // 树的根结点值
    int val;
    // 根节点对应的左节点
    TreeNode left = null;
    // 根节点对应的右节点
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
    
    /**
     * 前序遍历:使用stack 记录递归路径,须保证左子节点先出栈
     *
     * @param root
     */
    public static void preOrder2(TreeNode root) {
        if (root != null) {
            Stack<TreeNode> stack = new Stack<>();
            stack.add(root);
            while (!stack.isEmpty()) {
                root = stack.pop();
                if (root != null) {
                    System.out.print(root.val + "   ");
                    stack.push(root.right);
                    stack.push(root.left);
                }
            }
        }
    }
    /**
     * 中序遍历:将左子节点入栈,出栈打印值,然后添加右子节点
     *
     * @param root
     */
    public static void middleOrder2(TreeNode root) {
        if (root != null) {
            Stack<TreeNode> stack = new Stack<>();
            while (!stack.isEmpty() || root != null)
                if (root != null) {
                    stack.push(root);
                    root = root.left;
                } else {
                    root = stack.pop();
                    System.out.print(root.val + "   ");
                    root = root.right;
                }
        }
    }
    /**
     * 后序遍历
     * @param root
     */
    public void afterOrder2(TreeNode root) {
        TreeNode cur, pre = null;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.empty()) {
            cur = stack.peek();
            if ((cur.left == null && cur.right == null) || (pre != null && (pre == cur.left || pre == cur.right))) {
                System.out.print(cur.val + "->");
                stack.pop();
                pre = cur;
            } else {
                if (cur.right != null)
                    stack.push(cur.right);
                if (cur.left != null)
                    stack.push(cur.left);
            }
        }
    }
    
    public static void main(String[] args) {
        TreeNode root = new TreeNode(20);
        TreeNode node1 = new TreeNode(4);
        TreeNode node2 = new TreeNode(5);
        TreeNode node3 = new TreeNode(8);
        TreeNode node4 = new TreeNode(2);
        TreeNode node5 = new TreeNode(7);
        TreeNode node6 = new TreeNode(12);
        TreeNode node7 = new TreeNode(3);
        TreeNode node8 = new TreeNode(9);
        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        node3.left = node7;
        node4.right = node8;
        preOrder2(root);
        System.out.println();
        middleOrder2(root);
        System.out.println();
        afterOrder2(root);
    }
}

 

四。层序遍历

 

/**
     * 层序遍历
     * @param root
     */
    public static void levelOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            System.out.print(node.val + "->");
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
    }

 

标签: 算法与数据结构

目录
相关文章
|
4月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
39 3
|
3月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
34 1
java基础(11)函数重载以及函数递归求和
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
26 1
|
2月前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
31 6
|
3月前
|
域名解析 分布式计算 网络协议
java遍历hdfs路径信息,报错EOFException
java遍历hdfs路径信息,报错EOFException
42 3
|
4月前
|
存储 Java 数据处理
如何使用 Java 迭代 HashMap 中的 ArrayList
【8月更文挑战第23天】
54 2
|
4月前
|
存储 Java 数据处理
|
4月前
|
Java API 微服务
Java微服务架构应对互联网应用的大规模访问与快速迭代挑战
Java微服务架构应对互联网应用的大规模访问与快速迭代挑战,通过将应用分解为小型、自治的服务,增强系统灵活性与可扩展性。本文概览微服务定义及特点,深入剖析服务拆分、注册发现、API网关等核心原理,并介绍Spring Boot、Spring Cloud、Docker与Kubernetes等关键技术实践,助力高效构建稳定、高性能的企业级应用。
46 0
下一篇
DataWorks