Java二叉树的四种遍历(递归与非递归)

Java二叉树的四种遍历(递归与非递归)

简介

二叉树是一种常见的数据结构,其遍历方式包括前序遍历、中序遍历、后序遍历和层序遍历。Java中可以使用递归和非递归的方式进行遍历。在该攻略中,我们将详细介绍Java二叉树的四种遍历方式,包括递归和非递归实现,帮助读者提高对Java数据结构的理解。

前序遍历

在前序遍历中,我们先访问二叉树的根节点,然后分别访问左子树和右子树。在Java中,我们可以使用递归和非递归的方式实现前序遍历。

递归实现

public void preOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    System.out.println(root.val);
    preOrderTraversal(root.left);
    preOrderTraversal(root.right);
}

非递归实现

public void preOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while(!stack.isEmpty()){
        TreeNode node = stack.pop();
        System.out.println(node.val);
        if(node.right!=null){
            stack.push(node.right);
        }
        if(node.left!=null){
            stack.push(node.left);
        }
    }
}

中序遍历

在中序遍历中,我们先访问二叉树的左子树,然后访问根节点,最后再访问右子树。同样地,在Java中我们也可以使用递归和非递归的方式实现中序遍历。

递归实现

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

非递归实现

public void inOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    TreeNode node = root;
    while(!stack.isEmpty() || node!=null){
        while(node!=null){
            stack.push(node);
            node = node.left;
        }
        node = stack.pop();
        System.out.println(node.val);
        node = node.right;
    }
}

后序遍历

在后序遍历中,我们先访问二叉树的左子树,然后访问右子树,最后再访问根节点。同样地,在Java中我们也可以使用递归和非递归的方式实现后序遍历。

递归实现

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

非递归实现

public void postOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    TreeNode prev = null;
    while(!stack.isEmpty()){
        TreeNode curr = stack.peek();
        if(prev == null || prev.left == curr || prev.right == curr){
            if(curr.left!=null){
                stack.push(curr.left);
            }else if(curr.right!=null){
                stack.push(curr.right);
            }
        }else if(curr.left == prev){
            if(curr.right!=null){
                stack.push(curr.right);
            }
        }else{
            System.out.println(curr.val);
            stack.pop();
        }
        prev = curr;
    } 
}

层序遍历

在层序遍历中,我们按照从上到下、从左到右的顺序访问二叉树的每个节点。同样地,在Java中我们也可以使用队列的非递归方式实现层序遍历。

非递归实现

public void levelOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()){
        int levelSize = queue.size();
        for(int i=0;i<levelSize;i++){
            TreeNode curr = queue.poll();
            System.out.println(curr.val);
            if(curr.left!=null){
                queue.offer(curr.left);
            }
            if(curr.right!=null){
                queue.offer(curr.right);
            }
        }
    } 
}

示例说明

以下为一个简单的二叉树:

       1
     /   \
    2     3
   / \
  4   5

前序遍历

递归:1 2 4 5 3

非递归:1 2 4 5 3

中序遍历

递归:4 2 5 1 3

非递归:4 2 5 1 3

后序遍历

递归:4 5 2 3 1

非递归:4 5 2 3 1

层序遍历

1 2 3 4 5

以上是Java二叉树的四种遍历方式及其实现。希望能够帮助读者更好地掌握Java的数据结构,提高代码能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java二叉树的四种遍历(递归与非递归) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++实现LeetCode(237.删除链表的节点)

    LeetCode 237. 删除链表中的节点是一道比较基础的链表问题。题目要求,给定链表中的一个节点(不是尾节点),删除该节点。 以下是完整的C++实现攻略。 算法思路 这道题目要求删除链表的一个节点,但是删除一个节点需要知道该节点的前一个节点的位置。但本题中,我们并没有给定要删除节点的前一个节点。 因此,我们可以把要删除节点的值替换为下一个节点的值,再将下…

    other 2023年6月27日
    00
  • php实例化一个类的具体方法

    关于如何实例化一个PHP类,我可以提供如下完整攻略: 1. 先定义一个类 在实例化一个类的之前,我们需要先定义一个PHP类,例如: class Example { public function __construct() { echo ‘这是一个例子’; } } 2. 实例化一个类 在PHP中,实例化一个类只需要使用new关键字即可,例如: $exampl…

    other 2023年6月26日
    00
  • umask函数

    umask函数 在UNIX和类UNIX系统中,umask函数是用于设置进程的文件创建权限掩码的函数。当进程创建一个新文件或目录时,文件的权限掩码会应用于该文件,并从文件的权限中减去相应的位。这项技术确保了一个默认的安全级别,以防止新创建的文件对于其他用户或进程可见或访问。 umask的语法和参数 umask函数的语法如下: mode_t umask(mode…

    其他 2023年3月29日
    00
  • Go基础教程系列之import导入包(远程包)和变量初始化详解

    Go基础教程系列之import导入包(远程包)和变量初始化详解 在Go语言中,我们可以使用import语句导入包(包括本地包和远程包),并使用变量初始化来为变量赋初值。以下是关于这两个主题的详细攻略。 1. 导入包(远程包) 要导入包,我们可以使用import关键字,后跟包的路径。对于本地包,我们可以直接指定包的相对或绝对路径。对于远程包,我们可以使用完整的…

    other 2023年10月12日
    00
  • 电脑可用内存与实际内存不一致问题如何解决?

    解决电脑可用内存与实际内存不一致问题的攻略 问题背景 在使用电脑时,有时候会遇到电脑可用内存与实际内存不一致的问题。这种情况下,电脑显示的可用内存比实际内存要少,导致系统运行缓慢或者出现其他问题。这个问题通常是由于一些软件或者系统设置导致的,但是可以通过一些方法来解决。 攻略步骤 步骤一:检查系统设置 首先,我们需要检查系统设置,确保操作系统正确地识别和使用…

    other 2023年7月31日
    00
  • AutoCAD 2019已经发布了 AutoCAD 2019下载地址及新功能介绍(附序列号)

    AutoCAD 2019发布攻略 1. AutoCAD 2019简介 AutoCAD 2019是一款功能强大的计算机辅助设计(CAD)软件,它提供了广泛的设计工具和功能,用于创建和编辑2D和3D模型。AutoCAD 2019具有许多新功能和改进,使其成为设计师和工程师的首选工具。 2. AutoCAD 2019新功能介绍 以下是AutoCAD 2019的一些…

    other 2023年8月4日
    00
  • 易语言使用通用对话框打开程序返回完整路径的文件名

    下面我将为你详细讲解易语言使用通用对话框打开程序返回完整路径的文件名的完整攻略。 什么是通用对话框打开程序? 通用对话框打开程序,也称为系统文件打开对话框,是 Windows 操作系统提供的一种标准对话框框架,可以用来让用户选择一个或多个文件或文件夹。通用对话框提供了一个标准的用户界面,使得用户可以很方便地进行文件浏览、文件选择等操作。 如何使用通用对话框打…

    other 2023年6月26日
    00
  • idea安装vue插件图文详解

    以下是“idea安装vue插件图文详解”的完整攻略,包括插件安装、配置和示例说明。 1. 安装Vue插件 在IntelliJ IDEA中安装Vue插件非常简单,只按照以下步骤操作即可: 打开IntelliJ IDEA,点击菜单栏中的“File” -> “Settings”。 在弹出窗口中,选择“Plugins”选项卡。 在搜索框中输入“Vue.js”,…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部