二叉树的遍历-树-数据结构和算法(Java)

news2024/12/23 13:37:48

1 树的遍历方式

1.1 深度优先

事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.

那么对于树来说,"深度优先"有可以细分为前序遍历、中序遍历和后序遍历。

1.2 广度优先

BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)

在树中中同样算法或者思想的遍历方式就是层序遍历。

2 二叉树的遍历方式

遍历都是从根结点开始,前序、中序和后序遍历,是指根结点相对于其左子树和右子树的访问顺序。实现方式为非递归实现,递归实现自行实现或者查阅相关文档。下面以一个二叉搜索树为例,来看看各种遍历方式结果。如下图2-1所示:在这里插入图片描述

2.1 前序遍历

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

非递归实现:

public Iterable<E> preTraversal() {
    Queue<E> q = new LinkQueue<>();
    Stack<TreeNode<E>> l = new Stack<>();
    l.push(root);
    while (!l.isEmpty()) {
        TreeNode<E> pop = l.pop();
        q.offer(pop.item);
        if (pop.right != null)
            l.push(pop.right);
        if (pop.left != null)
            l.push(pop.left);
    }

    return q;
}

前序遍历图示:在这里插入图片描述

输出顺序:33 23 3 25 82 70 100

测试:更改BinarySearchTree迭代实现为前序遍历

Itr() {
    iterator = preTraversal().iterator();
}

public class TestTree {
    public static void main(String[] args) {
        BinarySearchTree<Integer> bst = new BinarySearchTree<>();
        bst.add(33);
        bst.add(23);
        bst.add(82);
        bst.add(3);
        bst.add(25);
        bst.add(70);
        bst.add(100);

        System.out.println(bst);
    }
}
// 测试结果
[33,23,3,25,82,70,100]

2.2 中序遍历

中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

非递归实现:

public Iterable<E> midTraversal() {
    Queue<E> q = new LinkQueue<>();

    Stack<TreeNode<E>> l = new Stack<>();
    TreeNode<E> current = root;

    while (current != null || !l.isEmpty()) {
        while (current != null) {
            l.push(current);
            current = current.left;
        }
        if (!l.isEmpty()) {
            current = l.pop();
            q.offer(current.item);
            current = current.right;
        }
    }

  return q;
}

中序遍历示意图如下2.2-1所示:在这里插入图片描述

输出顺序:3 23 25 33 70 82 100

测试:

Itr() {
iterator = midTraversal().iterator();
}
// 测试代码同上
// 输出结果:
[3,23,25,33,70,82,100]

2.3 后序遍历

后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。

非递归实现:

public Iterable<E> postTraversal() {
   Queue<E> q = new LinkQueue<>();

   Stack<TreeNode<E>> stack = new Stack<>();
   TreeNode<E> pre = root;
   TreeNode<E> current = root;
   while (current != null || !stack.isEmpty()) {
       while (current != null) {
           stack.push(current);
           current = current.left;
       }
       if (!stack.isEmpty()) {
           current = stack.peek().right;
           if (current == null || pre == current) {
               pre = stack.pop();
               q.offer(pre.item);
               current = null;
           }
       }
   }

   return q;
}

后序遍历示意图如下2.3-1所示:在这里插入图片描述

输出顺序:3 25 23 70 100 82 33

测试:

Itr() {
iterator = postTraversal().iterator();
}
// 测试代码同上
// 测试结果
[3,25,23,70,100,82,33]

2.4 层序遍历

二叉树的层次遍历 ,顾名思义就是指从二叉树的第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按照从左到右的顺序对节点逐个访问。在逐层遍历过程中,按从顶层到底层的次序访问树中元素,在同一层中,从左到右进行访问。

非递归实现:

public Iterable<E> levelTraversal() {
    Queue<E> q = new LinkQueue<>();
    Queue<TreeNode<E>> l = new LinkQueue<>();
    l.offer(root);
    while (!l.isEmpty()) {
        TreeNode<E> pop = l.poll();
        q.offer(pop.item);
        if (pop.left != null)
            l.offer(pop.left);
        if (pop.right != null)
            l.offer(pop.right);
    }
    
    return q;
}

层序遍历示意图如下2.4-1所示:在这里插入图片描述

输出顺序:33 23 82 3 25 70 100

测试:

Itr() {
iterator = levelTraversal().iterator();
}
// 测试代码同上
// 测试结果
[33,23,82,3,25,70,100]

3 后记

​ 如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/algorithm

参考:

[1]百度百科.深度优先[EB/OL].

[2]百度百科.广度优先[EB/OL].

[3]百度百科.前序遍历[EB/OL].

[4]百度百科.中序遍历[EB/OL].

[5]百度百科.后序遍历[EB/OL].

[6]百度百科.层序遍历[EB/OL].

[7][美]Robert Sedgewich,[美]Kevin Wayne著;谢路云译.算法:第4版[M].北京:人民邮电出版社,2012.10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用阿里云国际版负载均衡管理多台服务器上的流量

有效处理多云服务器设置的流量和数据传输负载可能是一个复杂的过程。然而&#xff0c;这是完全必要的&#xff0c;因为业务关键型应用程序需要高度可用的解决方案来管理繁重的工作负载。阿里云服务器负载均衡器(SLB) 简化了工作负载在服务器、网络链路和其他资源之间的分配&…

[附源码]SSM计算机毕业设计闲置物品交易管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

mac系统废纸篓可以恢复么,mac不小心清空了废纸篓怎么找回

在使用Mac电脑的过程中&#xff0c;有可能会出现各种意外&#xff0c;其中误删文件是很常见的一种。如果你不小心删除了废纸篓里还有用的文件&#xff0c;mac系统废纸篓可以恢复么&#xff1f; 一、我不小心删除了重要文件&#xff0c;还清倒了废纸篓 案例分享&#xff1a;mac…

软件测试面试题-一个前后端都能修改的bug,应该由谁修改?

其实这个问题还是问得比较有水平的一道面试题。 有很多人说&#xff0c;要不前端修改吧。那难道后端就不能修改吗&#xff1f; 之后又有人说&#xff0c;要不后端修改吧&#xff0c;那难道前端就不能修改吗&#xff1f; 瞬间求职者一脸懵逼。。。。 这道题该怎么去回答呢&…

在国内CDMP认证认可度如何?

随着数字化转型的深入&#xff0c;中国企业不再唯技术论&#xff0c;开始进行转型的整体思考和创新突破。数据是构成数字化业务重要材料&#xff0c;是企业运营变革和竞争优势塑造的核心动力&#xff0c;是实现数字化转型的坚实基础。越来越多的国内企业认识到数据治理知识在企…

spring复习04,静态代理动态代理,AOP

spring复习04,静态代理动态代理,AOP概念引入java代理模式静态代理静态代理模式的好处:静态代理模式的缺点&#xff1a;动态代理jdk动态代理1. InvocationHandler接口2. Proxy类jdk动态代理代码AOPAOP的概念spirng中aop的实现方式一&#xff1a;spring原生的接口方式二&#xff…

基于树莓派的freeRDP桌面云终端的简单实现

VDI虚拟桌面云系统可以通过RmoteFX, PCoIP,HDX等远程桌面显示协议将服务器端的虚拟操作系统桌面环境在远程云终端上显示出来。商用的VDI系统需要部署服务器端虚拟机管理软件如System Center, XenServer等软件,购买价格不菲的服务器硬件,以及500~1000元之间的云终端接入设备。…

模糊控制算法实例matlab程序

参考文献《智能控制——刘金锟》 以水位的模糊控制为例。如图4一4所示&#xff0c;设有一个水箱&#xff0c;通过调节阀可向内注水和向外抽水。设计一个模糊控制器&#xff0c;通过调节阀门将水位稳定在固定点附近。按照日常的操作经验&#xff0c;可以得到基本的控制规则为&am…

TikTok营销策略 如何打造TikTok爆款视频?

最近&#xff0c;电商商家们总在问&#xff0c;如何打造出TikTok爆款视频&#xff0c;以吸引更多浏览量&#xff0c;刺激TikTok变现。这里不难发现&#xff0c;视频创作也只是一种TikTok营销方式&#xff0c;今天就来说说如何打造TikTok爆款视频。TikTok视频营销策略一——清晰…

模型案例推荐:电力大数据项目案例模型分享

电力行业大数据项目模型 电力高架线路巡检绝缘子缺陷智能检测 涉及关键技术&#xff1a; 语义分割 目标检测 图像增强 图像切分 主要工具&#xff1a;Python 技术大类&#xff1a;计算机视觉 主要业务问题&#xff1a; 随着我国经济的高速发展&#xff0c;国民用电量逐年增…

SpringCloud - Sleuth分布式请求链路跟踪

文章目录一.概述二.zipkin搭建三.Sleuth链路监控实现1. payment8001生产者修改2. Consumer80消费者修改3. 测试一.概述 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前段请求都会…

【信息检索与数据挖掘】期末笔记(一)

文章目录什么是信息检索词项-文档矩阵倒排索引构建过程前三步最后一步布尔检索模型布尔查询的处理查询优化如何存储词典哈希表树有序检索模型对基本布尔操作的扩展短语查询和位置索引短语查询第一个解决方案第二个解决方案更快的索引表合并什么是信息检索 信息检索是从大规模非…

nuxt3:我们开始吧!

一、背景介绍 2022 年 11 月 16 日&#xff0c;全球最大的 Nuxt 会议 Nuxt Nation 2022 在线举行&#xff0c;并正式发布了 Nuxt.js 3.0 的第一个稳定版本。Nuxt 3 是基于 Vite、Vue3 和 Nitro 的 Nuxt 框架的现代重写&#xff0c;具有一流的 Typescript 支持&#xff0c;是两…

深入浅出的给大家分析下现在做抖音短视频还来得及吗?

2500字&#xff0c;需要一些耐心用心读完&#xff0c;让自己对于未来更清晰一些&#xff01; 大家好&#xff0c;我是我赢助手短视频运营&#xff0c;专注于短视频运营和创作&#xff1b;今天给大家分享下现在还来得及做短视频吗&#xff1f;深入浅出的给大家分析下这个问题。…

加缪——人生到底有什么意义?生命的意义就是生命本身

核心问题&#xff1a;人生到底有什么意义&#xff1f;如果人生没有意义&#xff0c;那么人是否应该自杀&#xff1f; 如果不是&#xff0c;那么人要以什么样的态度活着&#xff1f; 目录 一、《局外人》 二、名言 三、「个人感悟」对活着意义的幡然醒悟 四、《西西弗神话》…

SpringBoot+Vue实现前后端分离的校园健康检测管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

整合Druid数据源

1.数据库连接池简介 数据库连接池是个容器&#xff0c;负责分配、管理数据库连接(Connection)。它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。…

如何构建 API 生态促进企业上下游合作

构建 API 生态是互联网趋势 技术变革推动API数量爆发式增长 互联网在这10多年里&#xff0c;已经经历了多次的技术变革&#xff1a; 2010年以前&#xff0c;还是比较传统的开发模式。单体架构&#xff0c;自己开发大部分的代码&#xff0c;只有少量边缘业务会使用开源的项目代…

二肽Ile-Ala,24787-73-3,H2N-IA-OH

Forms nanotubes as its retroanalog H-Ala-Ile-OH 形成纳米管作为它的反模拟h - ala - il - oh。 编号: 196850中文名称: 二肽Ile-Ala英文名: Ile-AlaCAS号: 24787-73-3单字母: H2N-IA-OH三字母: H2N-Ile-Ala-COOH氨基酸个数: 2分子式: C9H18N2O3平均分子量: 202.25精确分子量…

PyCharm安装教程

PyCharm安装教程第一阶段&#xff1a;安装python第二阶段&#xff1a;安装pycharm第三阶段&#xff1a;新建python项目安装包链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1JIbdnhupYLVHK6Q_fzNCcw?pwddvzo 提取码&#xff1a;dvzo 第一阶段&#xff1a;安装pyt…