Java数据结构之《链式二叉树的创建及遍历》(难度系数100)

一、前言:

  这是怀化学院的:Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成类似的代码,重要的是理解它的算法原理!)

二、题目要求如下:

(第 12 题) 链式二叉树的创建及遍历(难度系数100)

链式二叉树的创建及遍历
描述:
树的遍历有先序遍历、中序遍历和后序遍历。先序遍历的操作定义是先访问根结点,然后访问左子树,最后访问右子树。中序遍历的操作定义是先访问左子树,然后访问根,最后访问右子树。后序遍历的操作定义是先访问左子树,然后访问右子树,最后访问根。对于采用链式存储结构的二叉树操作中,创建二叉树通常
采用先序次序方式输入二叉树中的结点的值,空格表示空树。对于如下的二叉树,我们可以通过如下输入“AE-F--H--”得到( ‘-’表示空子树)。

试根据输入创建对应的链式二叉树,并输入其先序、中序和后序遍历结果。
输入:
输入第一行为一个自然数n,表示用例个数
接下来为n行字符串,每行用先序方式输入的要求创建的二叉树结点,’-’表示前一结点的子树为空子树。
输出:
对每个测试用例,分别用三行依次输出其先序、中序和后序遍历结果。
样例输入:
1
abdh---e-i--cf-j--gk---
样例输出:
abdheicfjgk
hdbeiafjckg
hdiebjfkgca

三、代码实现: (代码的做题原理全部在代码注释中,若还有疑问也可以翻书关于二叉树的链式存储结构以及二叉树的遍历以及递归实现的内容) 

<1>因为学校的提交测试的网站:不能有自己创建的包的声明,不能有代码注释以及要把所有的操作放在同一个类中等等......,所以我首先放一个干净的代码实现:(此题提交成功!)

import java.util.Scanner;public class Main {private static class Node{char data;Node lChild;Node rChild;public Node(char data){this.data=data;}}private static int num=0;public static Node setNode(Node node,String point){if(num<point.length()){char c =point.charAt(num++);if (c != '-') {node= new Node(c);node.lChild= setNode(node.lChild,point);node.rChild= setNode(node.rChild,point);}else {node=null;}}return node;}private static Node root=null;public static void main(String[] args) {Scanner sc =new Scanner(System.in);int n = sc.nextInt();while (n>0){String point=sc.next();root = setNode(root,point);preOrder();inOrder();postOrder();num=0; n--;}}public static void preOrder(){preOrder(root);System.out.println();}public static void preOrder(Node node){if(node!=null){System.out.print(node.data);preOrder(node.lChild);preOrder(node.rChild);}}public static void inOrder(){inOrder(root);System.out.println();}public static void inOrder(Node node){if(node!=null){inOrder(node.lChild);System.out.print(node.data);inOrder(node.rChild);}}public static void postOrder(){postOrder(root);System.out.println();}public static void postOrder(Node node){if(node!=null){postOrder(node.lChild);postOrder(node.rChild);System.out.print(node.data);}}
}

(1)全部放在一个类中去实现题目的所有要求。(其中注意创建了一个结点内部类

import java.util.Scanner;public class Main04 {//静态结点内部类(不这样的话主方法里用不了)private static class Node{char data;    //当前结点的存放的数据Node lChild;  //左孩子结点Node rChild;  //右孩子结点public Node(char data){this.data=data;}}private static int num=0;//要设为静态方法,不然主方法无法用//此方法是按照先序次序方式创建二叉树public static Node setNode(Node node,String point){//从下标0开始依次添加结点if(num<point.length()){char c =point.charAt(num++);  //注意这里每赋值完一个会往后移if (c != '-') {node= new Node(c);  //这里给每个创建的新结点只要不是空结点就赋值//先左结点,再创建右结点node.lChild= setNode(node.lChild,point);node.rChild= setNode(node.rChild,point);}else {node=null;}}return node;}//创建应该初始的空根结点,也是要静态的变量才行private static Node root=null;public static void main(String[] args) {Scanner sc =new Scanner(System.in);int n = sc.nextInt();while (n>0){String point=sc.next();root = setNode(root,point);preOrder();inOrder();postOrder();num=0;  //每次记得重置一下,因为这个我测试了好久才发现这个小错误n--;}}//实现先序遍历("根"结点 -> 左孩子 -> 右孩子)public static void preOrder(){preOrder(root);System.out.println();   //遍历完记得换行}public static void preOrder(Node node){//首先判断传进来的"根结点"是否为空if(node!=null){//只要不为空就先输出当前"根结点"并继续遍历其左孩子,直到左孩子无左右孩子,再输出当前"根结点",再往前递归System.out.print(node.data);preOrder(node.lChild);preOrder(node.rChild);}}//实现中序遍历(左孩子 -> "根"结点 ->右孩子)public static void inOrder(){inOrder(root);System.out.println();  //遍历完记得换行}public static void inOrder(Node node){//首先判断传进来的"根结点"是否为空,然后先遍历左孩子,直到左孩子的左孩子为空,那就输出当前的"根结点",再遍历右孩子,再往前递归if(node!=null){inOrder(node.lChild);System.out.print(node.data);inOrder(node.rChild);}}//实现后序遍历(左孩子 -> 右孩子 ->"根"结点 )public static void postOrder(){postOrder(root);System.out.println();  //遍历完记得换行}public static void postOrder(Node node){//首先判断传进来的"根结点"是否为空,然后先遍历左孩子,直到左孩子的左右孩子为空,那就输出当前的"根结点",再往前递归if(node!=null){postOrder(node.lChild);postOrder(node.rChild);System.out.print(node.data);}}
}

四、不同情况的代码测试运行结果:

<1>首先是题目中的测试输入样例:(最好手打输入测试,直接复制可能格式问题导致报错!)

<2>其他: 

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

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

相关文章

视频剪辑:视频转码实用技巧,批量将MP4转为MP3音频

随着数字媒体设备的普及&#xff0c;视频和音频文件已成为日常生活中的重要组成部分。有时&#xff0c;可能要将MP4视频文件转换为MP3音频文件&#xff0c;以提取其中的音频内容或者进行其他处理。这是耗费时间的任务&#xff0c;那要如何操作呢&#xff1f;本文详解云炫AI智剪…

教你pycharm运行Django第一个项目

文章目录 前言搭建Django:1.新建Django项目&#xff1a;2.为Django项目指定远程中创建的虚拟环境下的python解释器&#xff1a;3.配置ubuntu的端口转发&#xff08;添加端口号为1234的端口&#xff09;&#xff1a;关于Python技术储备一、Python所有方向的学习路线二、Python基…

循环单向链表与约瑟夫问题

循环链表介绍 先不急着看约瑟夫问题是什么&#xff0c;先了解循环链表的结构&#xff0c;那什么是循环链表&#xff1f; 循环&#xff0c;顾名思义&#xff0c;从链表中第一个节点出发&#xff0c;还会遇到第一个节点&#xff0c;形成循环的一环。也就是说链表中最后一个节点…

python 使用 watchdog 实现类似 Linux 中 tail -f 的功能

一、代码实现 import logging import os import threading import timefrom watchdog.events import FileSystemEventHandler from watchdog.observers import Observerlogger logging.getLogger(__name__)class LogWatcher(FileSystemEventHandler):def __init__(self, log_…

《opencv实用探索·十五》inRange二值化图像

opencv接口如下&#xff1a; void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函数实现二值化功能&#xff0c;主要是将在两个阈值内的像素值设置为白色&#xff08;255&#xff09;&#xff0c;而不在阈值区间内的像素值设置为黑色&am…

一篇文章带你快速入门 Nuxt.js 服务端渲染

1. Nuxt.js 概述 1.1 我们一起做过的SPA SPA&#xff08;single page web application&#xff09;单页 Web 应用&#xff0c;Web 不再是一张张页面&#xff0c;而是一个整体的应用&#xff0c;一个由路由系统、数据系统、页面&#xff08;组件&#xff09;系统等等&#xff0…

HbuilderX使用Uniapp+Vue3安装uview-plus

如果你是vue2版本想使用uniapp去配置uviewui库可以参考之前的文章 小程序的第三方ui库推荐较多的还是uview的&#xff0c;看起来比较美观&#xff0c;功能也比较完善&#xff0c;下面将提一下Vue3安装uview-plus库的教程 创建项目 安装 首先进入官网 uView-Plus 直接下载并导…

预训练--微调

预训练–微调 一个很简单的道理&#xff0c;如果我们的模型是再ImageNet下训练的&#xff0c;那么这个模型一定是会比较复杂的&#xff0c;意思就是这个模型可以识别到很多种类别的即泛化能力很强&#xff0c;但是如果要它精确的识别是否某种类别&#xff0c;它的表现可能就不…

07-2 Python模块和命名空间

1. 模块 概念&#xff1a;其实就是一个Python文件&#xff0c;正常文件有的变量&#xff0c;函数&#xff0c;类&#xff0c;模块都有 功能:模块可以被其它程序引入&#xff0c;以使用该模块中的函数等功能。 示例&#xff1a;test-module.py调用mymodule.py模块中的now_time…

一篇文章带你快速入门 Vue 核心语法

一篇文章带你快速入门 Vue 核心语法 一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) …

Mysql 日期函数大全

一、时间函数 &#xff08;一&#xff09;、获取当前时间 1、NOW() 获取当前日期和时间&#xff0c;在程序一开始执行便拿到时间 返回格式 YYYY-MM-DD hh:mm:ss eg&#xff1a; NOW() 得到 2023-12-03 12:20:02 NOW(),SLEEP(2),NOW() 得到 2023-12-03 12:20:02 | 0 | 2023-…

目标检测——OverFeat算法解读

论文&#xff1a;OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 作者&#xff1a;Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun 链接&#xff1a;https://arxiv.org/abs/1312.6229 文章…

SpringAOP专栏二《原理篇》

上一篇SpringAOP专栏一《使用教程篇》-CSDN博客介绍了SpringAop如何使用&#xff0c;这一篇文章就会介绍Spring AOP 的底层实现原理&#xff0c;并通过源代码解析来详细阐述其实现过程。 前言 Spring AOP 的实现原理是基于动态代理和字节码操作的。不了解动态代理和字节码操作…

【C语言】函数递归详解(一)

目录 1.什么是递归&#xff1a; 1.1递归的思想&#xff1a; 1.2递归的限制条件&#xff1a; 2.递归举例&#xff1a; 2.1举例1&#xff1a;求n的阶乘&#xff1a; 2.1.1 分析和代码实现&#xff1a; 2.1.2图示递归过程&#xff1a; 2.2举例2&#xff1a;顺序打印一个整数的…

机器学习---集成学习的初步理解

1. 集成学习 集成学习(ensemble learning)是现在非常火爆的机器学习方法。它本身不是一个单独的机器学 习算法&#xff0c;而是通过构建并结合多个机器学习器来完成学习任务。也就是我们常说的“博采众长”。集 成学习可以用于分类问题集成&#xff0c;回归问题集成&#xff…

多线程并发Ping脚本

1. 前言 最近需要ping地址&#xff0c;还是挺多的&#xff0c;就使用python搞一个ping脚本&#xff0c;记录一下&#xff0c;以免丢失了。 2. 脚本介绍 首先检查是否存在True.txt或False.txt文件&#xff0c;并在用户确认后进行删除&#xff0c;然后从IP.txt的文件中读取IP地…

CSS——sticky定位

1. 大白话解释sticky定位 粘性定位通俗来说&#xff0c;它就是相对定位relative和固定定位fixed的结合体&#xff0c;它的触发过程分为三个阶段 在最近可滚动容器没有触发滑动之前&#xff0c;sticky盒子的表现为相对定位relative【第一阶段】&#xff0c; 但当最近可滚动容…

【MATLAB】tvfEMD信号分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解&#xff08;TVFEMD&#xff09;、傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的信号分解方…

电子学会C/C++编程等级考试2021年06月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字变换 给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变换 1. 交换相邻的两个数字 2. 将一个数字加1。如果加1后大于9,则变为0 3. 将一个数字加倍。如果加倍后大于…

Python configparser 模块:优雅处理配置文件的得力工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 配置文件在软件开发中扮演着重要的角色&#xff0c;而Python中的 configparser 模块提供了一种优雅而灵活的方式来处理各种配置需求。本文将深入介绍 configparser 模块的各个方面&#xff0c;通过丰富的示例代码…