Java數據結構06——樹

1.why:

數組&鏈表&樹

?

?

2. 大綱

?

2.1前中后序

public class HeroNode {private int no;private String name;private  HeroNode left;//默認為nullprivate HeroNode right;//默認為nullpublic HeroNode(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode right) {this.right = right;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +'}';}//遍歷//編寫前序遍歷方法,被誰調用this就是誰public void preOrder(){System.out.println(this);//先輸出父節點//遞歸先左子樹前遍歷if(this.left!=null){this.left.preOrder();}//遞歸向右子樹前序遍歷if (this.right!=null){this.right.preOrder();}};//編寫中序遍歷方法public void infixOrder(){//遞歸先左子樹前遍歷if(this.left!=null){this.left.infixOrder();}//再輸出父節點System.out.println(this);//遞歸向右子樹前序遍歷if (this.right!=null){this.right.infixOrder();}};//編寫后序遍歷方法public void postOrder(){//遞歸先左子樹前遍歷if(this.left!=null){this.left.postOrder();}//遞歸向右子樹前序遍歷if (this.right!=null){this.right.postOrder();}//最后輸出父節點System.out.println(this);};}

2.2查找節點

 //查找//前序查找public HeroNode preSearch(int HeroNo){//判斷當前節點是不是if (this.getNo()==HeroNo){return this;};//左子樹前序查找//如果左遞歸前序查找節點,找到結點,則返回HeroNode resNode = null;//輔助節點if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不為空才返回,因為右子樹仍未查找if (resNode!=null){return resNode;}if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}return resNode;}//中序查找public HeroNode infixSearch(int HeroNo){//左子樹前序查找//如果左遞歸前序查找節點,找到結點,則返回HeroNode resNode = null;//輔助節點if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不為空才返回,因為右子樹仍未查找if (resNode!=null){return resNode;};//判斷當前節點是不是if (this.getNo()==HeroNo){return this;}//查找右子樹if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}return resNode;}//后序查找public HeroNode postSearch(int HeroNo){//左子樹前序查找//如果左遞歸前序查找節點,找到結點,則返回HeroNode resNode = null;//輔助節點if (this.getLeft()!=null) {resNode =this.getLeft().preSearch(HeroNo);}//resNode不為空才返回,因為右子樹仍未查找if (resNode!=null){return resNode;};if (this.getRight()!=null){resNode = this.getRight().preSearch(HeroNo);}if (resNode!=null){return resNode;};//最后判斷當前節點是不是if (this.getNo()==HeroNo){return this;};return resNode;}

2.3刪除節點(基本)?

//刪除public void deleteNode(int HeroNo){//判斷左子節點if (this.left!=null && this.left.getNo()==HeroNo){this.left=null;return;}//判斷右子節點if (this.right!=null&&this.right.getNo()==HeroNo){this.right=null;return;}//遍歷左子樹if (this.left!=null){this.left.deleteNode(HeroNo);}if(this.right!=null){this.right.deleteNode(HeroNo);}}

2.4二叉樹 (root節點)

public class BinaryTree {//rootprivate HeroNode root;public void setRoot(HeroNode root) {this.root = root;};//遍歷二叉樹//前序遍歷public void preOrder(){if (this.root!=null){this.root.preOrder();}else {System.out.println("二叉樹為空");}}//中序遍歷public void infixOrder(){if (this.root!=null){this.root.infixOrder();}else {System.out.println("二叉樹為空");}}//后續遍歷public void postOrder(){if (this.root!=null){this.root.postOrder();}else {System.out.println("二叉樹為空");}}//查找二叉樹指定節點//前序查找public HeroNode preSearch(int HeroNo){if (this.root!=null){return this.root.preSearch(HeroNo);}else {return null;}}//中序查找public HeroNode infixSearch(int HeroNo){if (this.root!=null){return this.root.infixSearch(HeroNo);}else {return null;}}//后序查找public HeroNode postSearch(int HeroNo){if (this.root!=null){return this.root.postSearch(HeroNo);}else {return null;}}public void delNode(int HeroNo){if(root!=null){if (root.getNo()==HeroNo){root=null;}else {root.deleteNode(HeroNo);}}else {System.out.println("空樹,無法刪除");}}
}

2.5順序存儲二叉樹??(為完全二叉樹,公式

public class ArrBinaryTree {private int [] arr;//存儲結點的數組public ArrBinaryTree(int[] arr) {this.arr = arr;}//重載public void preOrder(){preOrder(0);}public void infixOrder(){infixOrder(0);}/**** @param index  arr[index]=i*///前序public void preOrder(int index){if(arr == null ||arr.length==0){System.out.println("數組為空");}System.out.println(arr[index]);//向左遞歸遍歷if ((index*2+1)<arr.length){preOrder(2*index+1);}//向右遞歸遍歷if ((index*2+2)<arr.length){preOrder(2* index+2);}}//中序public void infixOrder(int index){if(arr == null ||arr.length==0){System.out.println("數組為空");}//向左遞歸遍歷if ((index*2+1)<arr.length){infixOrder(index*2+1);}System.out.println(arr[index]);//向右遞歸遍歷if ((index*2+2)<arr.length){infixOrder(2* index+2);}}
}

?2.6線索化二叉樹(節點左右節點類型、前驅指針

?

?

public class ThreadBinaryTree {private HeroNode root;//為了實現線索化,需要創建要給指向當前結點的前驅結點的指針// 在遞歸進行線索化時,pre總是保留前一個結點//pre指針private HeroNode pre =null;public HeroNode getRoot() {return root;}public HeroNode getPre() {return pre;}public void setPre(HeroNode pre) {this.pre = pre;}public void setRoot(HeroNode root) {this.root = root;};//重載threadNodes()public void threadedNodes(){this.threadedNodes(root);}/*多回顧*/
//    //中序線索化二叉樹public void threadedNodes(HeroNode node){//遞歸找到最左節點,然后返回if (node == null) {return;}//先線索化左子樹threadedNodes(node.getLeft());//線索化當前節點if (node.getLeft()==null){node.setLeft(pre);node.setLeftType(1);}//key!!!if (pre!=null&&pre.getRight()==null){pre.setRight(node);pre.setRightType(1);}pre=node;//線索化右子樹threadedNodes(node.getRight());};//***提高:中序、后序***//遍歷線索化二叉樹public void threadedList(){HeroNode node = root;while (root!=null){while(node!=null){//循環的找到leftType ==1的結點,第一個找到就是8結點// 后面隨著遍歷而變化,因為當leftType==1時,說明該結點是按照線索化// 處理后的有效結點while (node.getLeftType()==0){node=node.getLeft();}System.out.println(node);while (node.getRightType()==1){node=node.getRight();System.out.println(node);}//替換這個遍歷點(對于原本就有右結點的)!!!node=node.getRight();}}}//遍歷二叉樹//前序遍歷public void preOrder(){if (this.root!=null){this.root.preOrder();}else {System.out.println("二叉樹為空");}}//中序遍歷public void infixOrder(){if (this.root!=null){this.root.infixOrder();}else {System.out.println("二叉樹為空");}}//后續遍歷public void postOrder(){if (this.root!=null){this.root.postOrder();}else {System.out.println("二叉樹為空");}}//查找二叉樹指定節點//前序查找public HeroNode preSearch(int HeroNo){if (this.root!=null){return this.root.preSearch(HeroNo);}else {return null;}}//中序查找public HeroNode infixSearch(int HeroNo){if (this.root!=null){return this.root.infixSearch(HeroNo);}else {return null;}}//后序查找public HeroNode postSearch(int HeroNo){if (this.root!=null){return this.root.postSearch(HeroNo);}else {return null;}}public void delNode(int HeroNo){if(root!=null){if (root.getNo()==HeroNo){root=null;}else {root.deleteNode(HeroNo);}}else {System.out.println("空樹,無法刪除");}}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209378.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209378.shtml

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

相關文章

Ubuntu編譯文件安裝SNMP服務

net-snmp源碼下載 http://www.net-snmp.org/download.html 編譯步驟 指定參數編譯 ./configure --prefix/root/snmpd --with-default-snmp-version"2" --with-logfile"/var/log/snmpd.log" --with-persistent-directory"/var/net-snmp" --wi…

MinIO集群模式信息泄露漏洞(CVE-2023-28432)

前言&#xff1a;MinIO是一個用Golang開發的基于Apache License v2.0開源協議的對象存儲服務。雖然輕量&#xff0c;卻擁有著不錯的性能。它兼容亞馬遜S3云存儲服務接口&#xff0c;非常適合于存儲大容量非結構化的數據。該漏洞會在前臺泄露用戶的賬戶和密碼。 0x00 環境配置 …

html、css類名命名思路整理

開發頁面時&#xff0c;老是遇到起名問題&#xff0c;越想越頭疼&#xff0c;嚴重影響開發進度&#xff0c;都是在想名字&#xff0c;現在做一下梳理&#xff0c;統一一下思想&#xff0c;希望以后能減少這塊的痛苦。 命名規則 [功能名稱]__[組成部分名稱]--[樣式名稱] 思路…

MySQL生產環境_使用SQL中的ROW_NUMBER()函數查找每個ID的最新記錄

生產需求 應生產環境要求&#xff0c;需要獲取到每個id的最新位置及其他GL屬性 ROW_NUMBER函數 ROW_NUMBER()函數是一種窗口函數&#xff0c;可以根據指定的列對結果集中的行進行編號。通過結合PARTITION BY子句和ORDER BY子句&#xff0c;ROW_NUMBER()函數能夠對數據進行分組…

空間運算設備-Apple Vision Pro

蘋果以其在科技領域的創新而聞名&#xff0c;他們致力于推動技術的邊界&#xff0c;這在他們的產品中表現得非常明顯。他們嘗試開發一項的新型突破性顯示技術。在 2023 年 6 月 5 日官網宣布將發布 Apple Vision Pro 頭戴空間設備&#xff0c;我們一起來了解一下 Apple Vision …

SVPWM原理及simulink

關注微?“電擊小子程高興的MATLAB小屋”獲得專屬優惠 一.SVPWM原理 SPWM常用于變頻調速控制系統&#xff0c;經典的SPWM控制主要目的是使變頻器的輸出電壓盡量接近正弦波&#xff0c;并未關注輸出的電流波形。而矢量控制的最終目的是得到圓形的旋轉磁場&#xff0c;這樣就要求…

【面試常考題目】五種方法解決“如何在n個無序數組中找出它的中位數(java)”問題

1.3 從N個數組中找到中位數&#xff0c;每一個數組可能亂序 在LeetCode上&#xff0c;"尋找多個數組的中位數"這類問題通常是由兩個數組合并中位數問題&#xff08;即LeetCode第4題&#xff09;的變種或擴展。直接對應于多個數組合并后尋找中位數的題目在LeetCode上…

BeyondCompare-過期-mac電腦

在/Applications/Beyond Compare.app/Contents/MacOS/目錄下的BCompare程序是BeyondCompare的可執行文件。 在 /Users/username/Library/Application Support/Beyond Compare/目錄下的registry.dat文件是存儲程序注冊信息的。包括剛開始使用的時間。 想要無限的使用BeyondCompa…

根據圖片生成前端代碼:GPT vesion 助你釋放效能 | 開源日報 No.98

php/php-src Stars: 36.4k License: NOASSERTION PHP 是一種流行的通用腳本語言&#xff0c;特別適合 Web 開發。快速、靈活和實用&#xff0c;PHP 支持從博客到世界上最受歡迎的網站等各種應用。PHP 遵循 PHP 許可證 v3.01 發布。 主要功能&#xff1a; 提供強大而靈活的腳…

代碼隨想錄算法訓練營 ---第五十六天

今天同樣是 動態規劃&#xff1a;編輯距離問題&#xff01; 第一題&#xff1a; 簡介&#xff1a; 本題有兩個思路&#xff1a; 1.求出最長公共子串&#xff0c;然后返還 word1.length()word2.length()-2*dp[word1.size()][word2.size()] 本思路解法與求最長公共子串相同&…

Mybatis XML改查操作(結合上文)

"改"操作 先在UserInfoXMLMapper.xml 中 : <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><map…

無向圖的鄰接表

在無向圖中&#xff0c;邊是雙向的&#xff0c;因此構建鄰接表時需要考慮兩個方向。下面是一個簡單的 JavaScript 代碼示例&#xff0c;用于構建無向圖的鄰接表&#xff1a; // 示例數據 const links [{ source: 1, target: 0 },{ source: 2, target: 0 },// ... 其他鏈接 ];…

主窗體、QFile、編碼轉換、事件、禁止輸入特殊字符

主窗體 部件構成 菜單欄、工具欄、主窗體、狀態欄。 UI 編輯器設計主窗體 &#x1f4a1; 簡易記事本的實現&#xff08;part 1&#xff09; 菜單欄 工具欄&#xff08;圖標&#xff09; 主窗體 完善菜單欄&#xff1a; mainwindow.cpp #include "mainwindow.h"…

java8 常用code

文章目錄 前言一、lambda1. 排序1.1 按照對象屬性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 數據庫排序jpa 2. 聚合2.1 基本聚合&#xff08;返回對象list&#xff09;2.2 多字段組合聚合&#xff08;直接返回對象list數量&#xff09; 二、基礎語法2.1 List2.1.1 數…

Holynix

信息收集階段 存活主機探測&#xff1a;arp-scan -l 當然了&#xff0c;正常來說我們不應該使用arp進行探測&#xff0c;arp探測的是arp的緩存表&#xff0c;我們應該利用nmap進行探測&#xff01; nmap -sT --min-rate 10000 192.168.182.0/24 端口探測 nmap -sT --min-rat…

Navicat 技術指引 | 適用于 GaussDB 分布式的調試器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

golang學習筆記——數據結構進階

文章目錄 數據結構進階mapmap示例sliceinterfaceembedded 數據結構進階 map map 讀取某個值時 - 返回結果可以為 value,bool 或者 value。注意后者&#xff0c;在key不存在時&#xff0c;會返回value對應類型的默認值map 的 range 方法需要注意 - key,value 或者 key。注意后…

【數據結構】單調棧與單調隊列算法總結

單調棧 知識概覽 單調棧最常見的應用是找到每一個數離它最近的且比它小的數。單調棧考慮的方式和雙指針類似&#xff0c;都是先想一下暴力做法是什么&#xff0c;然后再挖掘一些性質如單調性&#xff0c;最終可以把目光集中在比較少的狀態中&#xff0c;從而達到降低時間復雜…

業務設計原則

《億級流量網站架構核心技術》讀書筆記 一、防重設計 防重是通過在盡可能前端的位置阻擋請求重復執行&#xff0c;從而防止影響業務。它主要運用于“重復發生會造成業務影響”的場景。 請求本身可以發生多次&#xff0c;需要定義何為同一條業務數據。 分成業務本身允許多次和…

JS中call()、apply()、bind()改變this指向的原理

大家如果想了解改變this指向的方法&#xff0c;大家可以閱讀本人的這篇改變this指向的六種方法 大家有沒有想過這三種方法是如何改變this指向的&#xff1f;我們可以自己寫嗎&#xff1f; 答案是&#xff1a;可以自己寫的 讓我為大家介紹一下吧&#xff01; 1.call()方法的原理…