广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 二叉树遍历的常用方法
  • 432
分享到

Java 二叉树遍历的常用方法

2024-04-02 19:04:59 432人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录递归方式非递归方式层次遍历总结采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很大的相似性。因而针对前三种的遍历我们会总结出

采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很大的相似性。因而针对前三种的遍历我们会总结出对应通用的解决框架,便于在解决二叉树问题时进行使用。

递归方式

递归方式遍历二叉树时,无论是 前序遍历、中序遍历 还是 后续遍历 的方式,它们最大的区别就是对节点数据的访问位置不同。除此之外其结构完全一致,因而我们总结出如下的框架结构:


void traverse(Treenode root) {
    //终止条件
    if(root == null) return;
    // 前序遍历
    traverse(root.left);
    // 中序遍历
    traverse(root.right);
    // 后序遍历
}

对应注释的位置访问数据就可以实现不同的遍历方式。

例如,前序遍历:


void traverse(TreeNode root) {
    if(root == null) return;
    visit(root);
    traverse(root.left);
    traverse(root.right);
}

同样的中序遍历:


void traverse(TreeNode root) {
    if(root ==null) return;
    traverse(root.left);
    visit(root);
    traverse(root.right);
}

后续遍历:


void traverse(TreeNode root) {
    if(root ==null) return;
    traverse(root.left);
    traverse(root.right)
}

是否非常 easy!!

非递归方式

二叉树非递归遍历说实话有很多种实现方式,但本质上都是模拟整个遍历的过程来实现的。

为了便于理解,其中前序遍历、中序遍历、后序遍历我们采用一套类似的算法框架。

整个算法框架如下:


 public void traverse(TreeNode root) {
    // 边界判断
    if (root == null) {
      return;
    }
    Stack<TreeNode> stack = new Stack<>();
    TreeNode current = root;
    while (current != null || !stack.isEmpty()) {
       //节点非空时,证明父节点的左侧节点非空,直接入栈
      if (current != null) {
        //前序遍历 visit(current)
        stack.push(current);
        current = current.left;
      } else {
        //节点为空,证明左侧节点为空,出栈,更换游标节点方向
        current = stack.pop();
		//中续遍历 visit(current);
        current = current.right;
      }
    }
  }

后序遍历它的遍历顺序为**"左--> 右--> 根",较之与前序遍历的"根--> 左--> 右",好像是有很大的相似性,我们能否针对上边的框架进行修改,使由前序遍历转换成后序遍历??
答案是肯定的,我们可以观察到,可以先求出遍历顺序是"根--> 右--> 左"**"的节点序列,再倒序,便刚好是后序遍历的顺序:左右根。而遍历顺序是根右左的话,很好办,从前序遍历的代码中改两行就是了。

故而,可以选择使用两个栈,其中一个用于遍历,另一个用于结果的倒序。

实现代码如下:


//使用双栈来实现后序遍历
  public void postOrderTraverse(TreeNode root){
    Stack<TreeNode> stack = new Stack<>();
    Stack<Integer> res = new Stack<>();
    TreeNode cur = root;
    while (cur!=null || !stack.isEmpty()) {
      if (cur!=null){
        stack.push(cur);
        res.push(cur.val);
        cur = cur.right; //修改处
      }else{
        cur = stack.pop();
        cur = cur.left;  // 修改处
      }
    }
    while (!res.isEmpty()){
      visit(res.pop());
    }
  }

至此,非递归遍历完成,是不是也很 easy!!

下边我们可以看一下最后一种层次遍历

层次遍历

层次遍历本质上就是阉割版广度优先遍历,我们此处就直接给出 BFS 算法的框架:



int BFS(Node start,Node target){
    Queue<Node> q; //核心数据结构
    Set<Node> visited: //某些情况下可以通过byte数组来进行代替
    int step = 0; //记录扩散步数
    //起始节点入队列
    q.add(start);
    visited.offer(start);
    while(q not empty) {
        //必须要用sz来保存q.size(),然后扩散sz不能直接使用q.size()
        int sz = q.size();
        //将队列中的节点进行扩散
        for(int i =0 ; i < sz; i++) {
            Node cur = q.poll();
            // 目标节点判断
            if(cur is target) {
                return step;
            }
            // 邻接结点入队列
            for(Node n:cur.adjs) {
                //未访问节点入队列
                if(n is not int visited) {
                    visitd.add(n);
                    q.offer(n);
                }
            }
        }
        // 更新步数
        step++;
    }
}

此处我们借助 BFS 的框架,直接给出其实现方法:


void LevelOrder(TreeNode root){
    //初始化栈,并放入
    Queue<TreeNode> queue;
    queue.add(root);
    while( !queue.isEmpty()) {
        //出栈
        TreeNode cur = queue.poll();
        //访问节点
        visit(cur);
        //向下一层级扩散
        if(cur.left !=null) queue.add(cur.left);
        if(cur.right !=null) queue.add(cur.right);
    }
}

较之于 BFS,我们会发现,层次遍历,少了好多东西,比如不需要 visited 来标记已访问的节点(二叉树本身结构的特点,不可能出现重复遍历),也不需要将队列中的节点进行扩散等。

总结

至此,二叉树的四种遍历方式总结完成。我们发现其实二叉树所有的遍历方式都有一种通用的算法框架,只要掌握算法本身的框架还是比较容易能够写出实现代码的。

以上就是Java 二叉树遍历的常用方法的详细内容,更多关于Java 二叉树遍历的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java 二叉树遍历的常用方法

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

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

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

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

下载Word文档
猜你喜欢
  • Java 二叉树遍历的常用方法
    目录递归方式非递归方式层次遍历总结采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很大的相似性。因而针对前三种的遍历我们会总结出...
    99+
    2022-11-12
  • 二叉树遍历方法——前、中、后序遍历(java)
    二叉树结构: static class TreeNode{ public char val; public TreeNode left; public TreeNode right; ...
    99+
    2023-09-20
    算法
  • Java中二叉树遍历的常用方法有哪些
    这篇文章给大家分享的是有关Java中二叉树遍历的常用方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。采用前序遍历、中序遍历、后续遍历实现时,即便采用不同的实现方式(递归方式、非递归),它们的算法结构是有很...
    99+
    2023-06-15
  • java二叉树的遍历方式详解
    目录一、前序遍历(递归和非递归)二、中序遍历(递归和非递归)三、后序遍历(递归和非递归)四、层序遍历总结一、前序遍历(递归和非递归) 前序遍历就是先遍历根再遍历左之后是右 根左右 ...
    99+
    2022-11-12
  • Java实现二叉树的遍历方法是什么
    本篇内容主要讲解“Java实现二叉树的遍历方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现二叉树的遍历方法是什么”吧!遍历二叉树遍历或称周游,traversal。系统地访问数...
    99+
    2023-06-19
  • Java二叉树的遍历方式有哪些
    本篇内容主要讲解“Java二叉树的遍历方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java二叉树的遍历方式有哪些”吧!二叉树的四种遍历方式:二叉树的遍历(traversing bin...
    99+
    2023-06-25
  • Java 二叉树遍历特别篇之Morris遍历
    在前面,我们简单提及过二叉树的遍历方式,有递归和非递归两个版本的遍历。仔细想一想,不管是递归的,还是非递归的遍历,两种版本的遍历都是需要耗费大量的、额外的空间。比如当我们二叉树的高度...
    99+
    2022-11-12
  • 二叉树的中序遍历
    解题思路: 官方题解中介绍了三种方法来完成树的中序遍历,包括: 递归 借助栈的迭代方法 莫里斯遍历 在树的深度优先遍历中(包括前序、中序、后序遍历),递归方法最为直观易懂,但考虑到效率,我们通常不推荐使用递归。 栈迭代方法虽然提高了效率,但...
    99+
    2023-10-07
    python
  • Java二叉树的构造和遍历方法是什么
    今天小编给大家分享一下Java二叉树的构造和遍历方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目一 解...
    99+
    2023-06-29
  • Java二叉树的四种遍历方式详解
    二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访...
    99+
    2022-11-12
  • c语言二叉树的前序遍历方法
    这篇文章主要讲解了“c语言二叉树的前序遍历方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c语言二叉树的前序遍历方法”吧!题目给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,nu...
    99+
    2023-06-19
  • C++实现二叉树层序遍历的方法
    今天小编给大家分享一下C++实现二叉树层序遍历的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二叉树层序遍历Given ...
    99+
    2023-06-19
  • Python实现二叉树结构与进行二叉树遍历的方法详解
    二叉树的建立 使用类的形式定义二叉树,可读性更好 class BinaryTree: def __init__(self, root): self.key = root sel...
    99+
    2022-06-04
    二叉树 遍历 详解
  • 利用java如何实现遍历二叉树
    这篇文章给大家介绍利用java如何实现遍历二叉树,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。遍历二叉树,从上往下遍历。但是同层节点可以从左向右遍历,也可以从右向左遍历(也就是之字型遍历),其中,都需要队列进行实现。只...
    99+
    2023-05-31
    java 二叉树 遍历
  • Java如何实现二叉树和遍历
    这篇文章主要介绍了Java如何实现二叉树和遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是二叉树简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个...
    99+
    2023-06-29
  • 详解Java 二叉树的实现和遍历
    目录什么是二叉树二叉树建树前序建树中序建树后序建树二叉树的遍历什么是二叉树 简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。 由于很多排序算...
    99+
    2022-11-13
  • Python二叉树的定义及常用遍历算法分析
    本文实例讲述了Python二叉树的定义及常用遍历算法。分享给大家供大家参考,具体如下: 说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法。但作为一个有理想有追求的程序员。也应该学学非递归...
    99+
    2022-06-04
    遍历 算法 定义
  • python创建与遍历二叉树的方法实例
    前言 树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构;在计算机领域中也有广泛...
    99+
    2022-11-12
  • C语言二叉树的建立与遍历方法
    本篇内容介绍了“C语言二叉树的建立与遍历方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录这里给一个样例树:总结这里给一个样例树:代码:...
    99+
    2023-06-20
  • C语言之二叉树的遍历
    目录0.写在前面1.前序遍历步骤详解代码实现2.中序遍历步骤详解代码实现3.后序遍历步骤详解代码实现0.写在前面 认识二叉树结构最简单的方式就是遍历二叉树。所谓遍历二叉树就是按照某种...
    99+
    2023-05-14
    C语言实现二叉树遍历 二叉树遍历
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作