广告
返回顶部
首页 > 资讯 > 精选 >Java二叉树的递归和非递归遍历方法是什么
  • 203
分享到

Java二叉树的递归和非递归遍历方法是什么

2023-06-30 14:06:24 203人浏览 独家记忆
摘要

本篇内容主要讲解“Java二叉树的递归和非递归遍历方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java二叉树的递归和非递归遍历方法是什么”吧!前言二叉树的遍历方法分为前序遍历,中序遍

本篇内容主要讲解“Java二叉树递归和非递归遍历方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java二叉树的递归和非递归遍历方法是什么”吧!

前言

二叉树的遍历方法分为前序遍历,中序遍历,后续遍历,层序遍历。

Java二叉树的递归和非递归遍历方法是什么

1.递归遍历

对于递归,就不得不说递归三要素:以前序遍历为例

递归入参参数和返回值

因为要打印出前序遍历节点的数值,所以参数里需要传入List在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:

public void preorder(Treenode root, List<Integer> result)

确定终止条件

在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return

if (root == null) return;

单层循环逻辑

前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:

result.add(root.val);preorder(root.left, result);preorder(root.right, result);
// 前序遍历·递归·LC144_二叉树的前序遍历class Solution {    public List<Integer> preorderTraversal(TreeNode root) {        List<Integer> result = new ArrayList<Integer>();        preorder(root, result);        return result;    }    public void preorder(TreeNode root, List<Integer> result) {        if (root == null) {            return;        }        result.add(root.val);//先保存中间节点        preorder(root.left, result); //处理左边节点        preorder(root.right, result); //处理右边节点    }}// 中序遍历·递归·LC94_二叉树的中序遍历class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> res = new ArrayList<>();        inorder(root, res);        return res;    }    void inorder(TreeNode root, List<Integer> list) {        if (root == null) {            return;        }        inorder(root.left, list); //先处理左边节点        list.add(root.val);       //保存中间当前的节点        inorder(root.right, list);//先处理右边节点    }}// 后序遍历·递归·LC145_二叉树的后序遍历class Solution {    public List<Integer> postorderTraversal(TreeNode root) {        List<Integer> res = new ArrayList<>();        postorder(root, res);        return res;    }    void postorder(TreeNode root, List<Integer> list) {        if (root == null) {            return;        }        postorder(root.left, list);  //先处理左边节点        postorder(root.right, list); //再处理右边节点        list.add(root.val);          //保存最后      }}

2.非迭代遍历

//前序遍历class Solution {    public List<Integer> preorderTraversal(TreeNode root) {        List<Integer> res = new ArrayList<>();        Stack<TreeNode> stack = new Stack();        if (root == null) return res;        stack.push(root);        while (!stack.isEmpty()) {            TreeNode node = stack.pop();            res.add(node.val);            if (node.right != null) { //先将右孩子入栈,因为它在最后                stack.push(node.right);            }            if (node.left != null) { //左孩子入栈再出栈                stack.push(node.left);            }        }        return res;    }}//中序遍历class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> res = new ArrayList<>();        if (root == null) return res;        Stack<TreeNode> stack = new Stack();        TreeNode cur = root;        while (cur != null || !stack.isEmpty()) {            //如果可以,一直往左下探            if (cur != null) {                stack.push(cur);                cur = cur.left;            } else {                cur = stack.pop(); //弹出来的肯定是叶子节点或中间节点                res.add(cur.val); //将这个节点加入list                cur = cur.right; //查看当前节点是否有右节点,如果右,肯定是中间节点,如果没有,就是叶子节点,继续弹出就可以            }        }        return res;    }}//后序遍历//再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中class Solution {    public List<Integer> postorderTraversal(TreeNode root) {        List<Integer> res = new ArrayList<>();        if (root == null) return res;        Stack<TreeNode> stack = new Stack();        stack.push(root);        while (!stack.isEmpty()) {            TreeNode node = stack.pop();            res.add(node.val);            if (node.left != null) stack.push(node.left); // 相对于前序遍历,这更改一下入栈顺序 (空节点不入栈)            if (node.right != null) stack.push(node.right);// 空节点不入栈         }        Collections.reverse(res); // 将结果反转之后就是左右中的顺序了        return res;    }}

3.二叉树的统一迭代法

//前序遍历class Solution {    public List<Integer> preorderTraversal(TreeNode root) {        List<Integer> result = new LinkedList<>();        Stack<TreeNode> st = new Stack<>();        if (root != null) st.push(root);        while (!st.empty()) {            TreeNode node = st.peek();            if (node != null) {                st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中                if (node.right!=null) st.push(node.right);  // 添加右节点(空节点不入栈)                if (node.left!=null) st.push(node.left);    // 添加左节点(空节点不入栈)                st.push(node);                          // 添加中节点                st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。            } else { // 只有遇到空节点的时候,才将下一个节点放进结果集                st.pop();           // 将空节点弹出                node = st.peek();    // 重新取出栈中元素                st.pop();                result.add(node.val); // 加入到结果集            }        }        return result;    }}//中序遍历class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> result = new LinkedList<>();        Stack<TreeNode> st = new Stack<>();        if (root != null) st.push(root);        while (!st.empty()) {            TreeNode node = st.peek();            if (node != null) {                st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中                if (node.right!=null) st.push(node.right);  // 添加右节点(空节点不入栈)                st.push(node);                          // 添加中节点                st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。                if (node.left!=null) st.push(node.left);    // 添加左节点(空节点不入栈)            } else { // 只有遇到空节点的时候,才将下一个节点放进结果集                st.pop();           // 将空节点弹出                node = st.peek();    // 重新取出栈中元素                st.pop();                result.add(node.val); // 加入到结果集            }        }        return result;    }}//后序遍历class Solution {    public List<Integer> postorderTraversal(TreeNode root) {        List<Integer> result = new LinkedList<>();        Stack<TreeNode> st = new Stack<>();        if (root != null) st.push(root);        while (!st.empty()) {            TreeNode node = st.peek();            if (node != null) {                st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中                st.push(node);                          // 添加中节点                st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。                if (node.right!=null) st.push(node.right);  // 添加右节点(空节点不入栈)                if (node.left!=null) st.push(node.left);    // 添加左节点(空节点不入栈)                     } else { // 只有遇到空节点的时候,才将下一个节点放进结果集                st.pop();           // 将空节点弹出                node = st.peek();    // 重新取出栈中元素                st.pop();                result.add(node.val); // 加入到结果集            }        }        return result;    }}

到此,相信大家对“Java二叉树的递归和非递归遍历方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java二叉树的递归和非递归遍历方法是什么

本文链接: https://www.lsjlt.com/news/329449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java二叉树的递归和非递归遍历方法是什么
    本篇内容主要讲解“Java二叉树的递归和非递归遍历方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java二叉树的递归和非递归遍历方法是什么”吧!前言二叉树的遍历方法分为前序遍历,中序遍...
    99+
    2023-06-30
  • Java二叉树的四种遍历(递归与非递归)
    目录一、先序遍历与后序遍历 二、中序遍历三、层序遍历一、先序遍历与后序遍历 先序遍历根节点,再遍历左子树,再遍历右子树。 后序遍历先遍历左子树,再遍历右子树,再遍历根节点。 先序遍...
    99+
    2022-11-12
  • Java开发深入分析讲解二叉树的递归和非递归遍历方法
    目录前言1.递归遍历2.非迭代遍历3.二叉树的统一迭代法前言 二叉树的遍历方法分为前序遍历,中序遍历,后续遍历,层序遍历。 1.递归遍历 对于递归,就不得不说递归三要素:以前序遍历...
    99+
    2022-11-13
  • java栈如何实现二叉树的非递归遍历
    这篇文章主要介绍了java栈如何实现二叉树的非递归遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉树设置class Node{public int&...
    99+
    2023-06-14
  • C++实现二叉树非递归遍历算法详解
    目录一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1 方法一3.2 方法二一、二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点,左路节点和右子树。先访问...
    99+
    2023-05-17
    C++二叉树非递归遍历 C++非递归遍历 C++二叉树遍历
  • C++非递归实现二叉树的前中后序遍历
    目录二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的前序遍历 在不使用递归的方式遍历二叉树时,我们可以使用一个栈模拟递归的机制。二叉树的前序遍历顺序是:根 → 左子树 → ...
    99+
    2022-11-12
  • java栈实现二叉树的非递归遍历的示例代码
    一般来说遍历二叉树用到递归,但是用Stack进行遍历也是一个不错的方法。 二叉树设置 class Node{ public int val; public Node left...
    99+
    2022-11-11
  • java非递归实现之二叉树的前中后序遍历详解
    二叉树的前中后序遍历 核心思想:用栈来实现对节点的存储。一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成。 前序...
    99+
    2022-11-12
  • C++非递归如何实现二叉树的前中后序遍历
    小编给大家分享一下C++非递归如何实现二叉树的前中后序遍历,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!二叉树的前序遍历在不使用递归的方式遍历二叉树时,我们可以使...
    99+
    2023-06-21
  • 刷题系列 - Python用非递归实现二叉树后续遍历
    顺便把Python用非递归实现二叉树后续遍历也写了。其实前序中序和后续都是针对父节点说的。比如下面这个最简单二叉树。前序就是ABC,父节点A在前中序就是BAC,父节点A在中间后序就是BCA,父节点A在最后无论多复杂二叉树,基本都是同样遍历流...
    99+
    2023-06-02
  • Python用非递归实现二叉树中序遍历代码分享
    这篇文章主要介绍“Python用非递归实现二叉树中序遍历代码分享”,在日常操作中,相信很多人在Python用非递归实现二叉树中序遍历代码分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python用非递归实...
    99+
    2023-06-02
  • C语言进阶练习二叉树的递归遍历
    目录二叉树的前中后序遍历遍历二叉树求二叉树的结点个数遍历二叉树求二叉树的叶子结点个数求二叉树中data为x的结点求二叉树的深度二叉树的前中后序遍历 所谓二叉树遍历(Traversal...
    99+
    2022-11-13
  • 通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式
    详解二叉树的三种非递归遍历方式(附C、java源码) 前言 二叉树的递归遍历方式很简单,三种递归遍历方式的区别,只是printf放的位置不一样而已,这里就不多讲了。把前序遍历代码贴在...
    99+
    2022-11-12
  • 刷题系列 - Python中怎么通过非递归实现二叉树前序遍历
    这期内容当中小编将会给大家带来有关刷题系列 - Python中怎么通过非递归实现二叉树前序遍历,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。二叉树前序遍历(Binary Tree Preorder Tra...
    99+
    2023-06-02
  • 二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)
    typedef struct TreeNode *BinTree; typedef BinTree Position;  struct TreeN...
    99+
    2022-10-18
  • Java 数据结构中二叉树前中后序遍历非递归的具体实现详解
    目录一、前序遍历1.题目描述2.输入输出示例3.解题思路4.代码实现二、中序遍历1.题目描述2.输入输出示例3.解题思路4.代码实现三、后序遍历1.题目描述2.输入输出示例3.解题思...
    99+
    2022-11-12
  • 什么是Java二分查找非递归
    本篇内容主要讲解“什么是Java二分查找非递归”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java二分查找非递归”吧!基本介绍二分查找只适用于从有序的数列中进行查找(比如数字和字母),将...
    99+
    2023-06-15
  • 怎么用Python递归式实现二叉树前序,中序,后序遍历
    今天小编给大家分享一下怎么用Python递归式实现二叉树前序,中序,后序遍历的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。记...
    99+
    2023-06-29
  • 如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现
    本篇文章为大家展示了如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前序遍历1.题目描述给你二叉树的根节点 root ,返回它节点值的...
    99+
    2023-06-25
  • C语言数据结构二叉树递归的方法
    本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作