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.pswp.cn/news/207715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207715.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207715.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視頻剪輯:視頻轉碼實用技巧,批量將MP4轉為MP3音頻

隨著數字媒體設備的普及&#xff0c;視頻和音頻文件已成為日常生活中的重要組成部分。有時&#xff0c;可能要將MP4視頻文件轉換為MP3音頻文件&#xff0c;以提取其中的音頻內容或者進行其他處理。這是耗費時間的任務&#xff0c;那要如何操作呢&#xff1f;本文詳解云炫AI智剪…

TypeScript中泛型對象、泛型類

一. 概覽 本文詳細介紹泛型中泛型對象和泛型類的使用&#xff0c;結合實際應用場景&#xff0c;加深對泛型的理解、使用。 二. 泛型對象 舉個例子 const test {a: 1,b: 1 }一個類型有沒有一種可能讓我么在定義的時候傳入一個類似于變量的形參&#xff0c;在使用的時候傳入…

Jtti:香港云服務器如何實現遠程連接?

云服務器具有靈活擴展、高可用性、易于管理和數據安全等優點&#xff0c;因此被廣泛應用于各種業務場景。然而&#xff0c;對于初次使用云服務器的用戶來說&#xff0c;如何實現遠程連接可能是一個難題。本文將詳細介紹云服務器實現遠程連接的步驟和注意事項&#xff0c;幫助用…

教你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…

什么是HTTPS加密協議?HTTPS安全傳輸原理,SSL和TLS介紹,NGINX如何配置SSL證書

HTTPS介紹 HTTPS是超文本傳輸協議&#xff08;HTTP&#xff09;的安全版本。它使用SSL&#xff08;安全套接層&#xff09;或TLS&#xff08;傳輸層安全&#xff09;加密協議來保護數據傳輸的安全性和機密性&#xff0c;以防止未經授權的訪問和竊聽。HTTPS協議通常用于處理敏感…

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…

充電樁IC

充電樁IC 電子元器件百科 文章目錄 充電樁IC前言一、充電樁IC是什么二、充電樁IC的類別三、充電樁IC的應用實例四、充電樁IC的工作原理總結前言 充電樁IC的設計和功能會根據不同的充電協議和市場需求進行調整和定制。目前市場上有許多不同型號和廠家的充電樁IC可供選擇,以滿足…

一篇文章帶你快速入門 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 文章…

Go語言-讓我印象深刻的13個特性

我們正在加速進入云原生時代&#xff0c;Go語言作為云原生的一塊基石&#xff0c;確有它的獨到之處。本文介紹Go語言的幾個讓我印象深刻的特性。 1、兼顧開發效率和性能 Go語言兼顧開發效率和性能。可以像Python那樣有很快的開發速度&#xff0c;也可以像C那樣有很快的執行速…

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…