日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

数据结构Java05【二叉树概述、二叉树遍历、堆排序、线索二叉树实现及遍历】

發(fā)布時(shí)間:2024/9/30 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构Java05【二叉树概述、二叉树遍历、堆排序、线索二叉树实现及遍历】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)地址:【數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)-java版】? ? ? ? ? ? ? ? ??🚀數(shù)據(jù)結(jié)構(gòu)--Java專(zhuān)欄🚀

  • 筆記01【01-09】【概述、數(shù)組基本使用】【源碼、課件】
  • 筆記02【10-18】【棧、隊(duì)列、單鏈表(增刪節(jié)點(diǎn))、循環(huán)鏈表、雙向循環(huán)鏈表、遞歸(斐波那契、漢諾塔)】
  • 筆記03【19-27】【(時(shí)間、空間復(fù)雜度);八大排序(冒泡、快速、插入、希爾、選擇、歸并、基數(shù)、隊(duì)列基數(shù))】
  • 筆記04【28-33】【樹(shù)結(jié)構(gòu)(二叉樹(shù))概述、創(chuàng)建、遍歷、查找節(jié)點(diǎn)、刪除節(jié)點(diǎn)】
  • 筆記05【34-39】【順序存儲(chǔ)二叉樹(shù)概述、二叉樹(shù)遍歷、堆排序、線索二叉樹(shù)實(shí)現(xiàn)及遍歷】
  • 筆記06【40-48】【赫夫曼樹(shù)、概述、原理分析、代碼實(shí)現(xiàn)(數(shù)據(jù)壓縮、創(chuàng)建編碼表、解碼、壓縮文件、解壓文件)】
  • 筆記07【49-54】【二叉排序樹(shù)(添加、查找、刪除節(jié)點(diǎn))】
  • 筆記08【55-57】【二叉平衡樹(shù)(AVL)-概述、單旋轉(zhuǎn)、雙旋轉(zhuǎn)】
  • 筆記09【58-60】【計(jì)算機(jī)中數(shù)據(jù)的存儲(chǔ)原理、2-3樹(shù)的插入原理、B樹(shù)和B+樹(shù)】
  • 筆記10【61-63】【哈希表概述、散列函數(shù)的設(shè)計(jì)、散列沖突解決方案】
  • 筆記11【64-67】【圖結(jié)構(gòu)概述、圖遍歷原理(BFS\DFS)、圖遍歷代碼實(shí)現(xiàn)】

目? ?錄

P34-4.7順序存儲(chǔ)的二叉樹(shù)的概述

P35-4.8順序存儲(chǔ)的二叉樹(shù)的遍歷

P36-4.9常用排序算法之堆排序

P37-4.10線索二叉樹(shù)的概述

P38-4.11線索二叉樹(shù)代碼實(shí)現(xiàn)

1、TestThreadedBinaryTree.java

2、ThreadedBinaryTree.java

3、ThreadedNode.java

P39-4.12線索二叉樹(shù)的遍歷


P34-4.7順序存儲(chǔ)的二叉樹(shù)的概述

二叉樹(shù)數(shù)組的轉(zhuǎn)換

順序存儲(chǔ)的二叉樹(shù)通常情況,只考慮完全二叉樹(shù)

第n個(gè)元素的左子節(jié)點(diǎn)是:2*n+1;
第n個(gè)元素的右子節(jié)點(diǎn)是:2*n+2;
第n個(gè)元素的父節(jié)點(diǎn)是:(n-1)/2;

P35-4.8順序存儲(chǔ)的二叉樹(shù)的遍歷

將 數(shù)組 看成 完全二叉樹(shù)!以數(shù)組的方式遍歷二叉樹(shù)!

?

因?yàn)?根節(jié)點(diǎn)的左子節(jié)點(diǎn) 也會(huì)有 左子節(jié)點(diǎn),所以需要遞歸。

P36-4.9常用排序算法之堆排序

大頂堆:父節(jié)點(diǎn)永遠(yuǎn)大于子節(jié)點(diǎn)!數(shù)值大的 在?上面!

大頂堆 是 從大到小,小頂堆 是 從小到大!

升序排序 使用 大頂堆;降序排序 使用 小頂堆。

package demo4;import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] arr = new int[] { 9, 6, 8, 7, 0, 1, 10, 4, 2 };heapSort(arr);System.out.println(Arrays.toString(arr));}public static void heapSort(int[] arr) {// 開(kāi)始位置是最后一個(gè)非葉子節(jié)點(diǎn),即最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)int start = (arr.length - 1) / 2;// 調(diào)整為大頂堆for (int i = start; i >= 0; i--) {maxHeap(arr, arr.length, i);}// 先把數(shù)組中的第0個(gè)和堆中的最后一個(gè)數(shù)交換位置,再把前面的處理為大頂堆for (int i = arr.length - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;maxHeap(arr, i, 0);}}public static void maxHeap(int[] arr, int size, int index) {// 左子節(jié)點(diǎn)int leftNode = 2 * index + 1;// 右子節(jié)點(diǎn)int rightNode = 2 * index + 2;int max = index;// 和兩個(gè)子節(jié)點(diǎn)分別對(duì)比,找出最大的節(jié)點(diǎn)if (leftNode < size && arr[leftNode] > arr[max]) {max = leftNode;}if (rightNode < size && arr[rightNode] > arr[max]) {max = rightNode;}// 交換位置if (max != index) {int temp = arr[index];arr[index] = arr[max];arr[max] = temp;// 交換位置以后,可能會(huì)破壞之前排好的堆,所以,之前的排好的堆需要重新調(diào)整maxHeap(arr, size, max);}}}

P37-4.10線索二叉樹(shù)的概述

左右指針,如果沒(méi)有存東西,則 可以 將 該節(jié)點(diǎn)的指針 指向 該節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn) 或 后一個(gè)節(jié)點(diǎn)。

找一個(gè)標(biāo)記 區(qū)分 左(右子樹(shù))、前(后節(jié)點(diǎn))。

線索化二叉樹(shù)時(shí),一個(gè)節(jié)點(diǎn)的一個(gè)節(jié)點(diǎn),叫前驅(qū)節(jié)點(diǎn);
線索化二叉樹(shù)時(shí),一個(gè)節(jié)點(diǎn)的一個(gè)節(jié)點(diǎn),叫后繼節(jié)點(diǎn)。

P38-4.11線索二叉樹(shù)代碼實(shí)現(xiàn)

1、TestThreadedBinaryTree.java

package demo7;public class TestThreadedBinaryTree {public static void main(String[] args) {// 創(chuàng)建一顆樹(shù)ThreadedBinaryTree binTree = new ThreadedBinaryTree();// 創(chuàng)建一個(gè)根節(jié)點(diǎn)ThreadedNode root = new ThreadedNode(1);// 把根節(jié)點(diǎn)賦給樹(shù)binTree.setRoot(root);// 創(chuàng)建一個(gè)左節(jié)點(diǎn)ThreadedNode rootL = new ThreadedNode(2);// 把新創(chuàng)建的節(jié)點(diǎn)設(shè)置為根節(jié)點(diǎn)的子節(jié)點(diǎn)root.setLeftNode(rootL);// 創(chuàng)建一個(gè)右節(jié)點(diǎn)ThreadedNode rootR = new ThreadedNode(3);// 把新創(chuàng)建的節(jié)點(diǎn)設(shè)置為根節(jié)點(diǎn)的子節(jié)點(diǎn)root.setRightNode(rootR);// 為第二層的左節(jié)點(diǎn)創(chuàng)建兩個(gè)子節(jié)點(diǎn)rootL.setLeftNode(new ThreadedNode(4));ThreadedNode fiveNode = new ThreadedNode(5);rootL.setRightNode(fiveNode);// 為第二層的右節(jié)點(diǎn)創(chuàng)建兩個(gè)子節(jié)點(diǎn)rootR.setLeftNode(new ThreadedNode(6));rootR.setRightNode(new ThreadedNode(7));// 中序遍歷樹(shù)binTree.midShow();System.out.println("\n===============");// 中序線索化二叉樹(shù)binTree.threadNodes();ThreadedNode afterFive = fiveNode.rightNode;System.out.println(afterFive.value);}}

2、ThreadedBinaryTree.java

package demo7;public class ThreadedBinaryTree {ThreadedNode root;// 用于臨時(shí)存儲(chǔ)前驅(qū)節(jié)點(diǎn)// 每次調(diào)用threadNodes()函數(shù)-臨時(shí)節(jié)點(diǎn)都會(huì)改變ThreadedNode pre = null;// 遍歷線索二叉樹(shù)public void threadIterate() {// 用于臨時(shí)存儲(chǔ)當(dāng)前遍歷節(jié)點(diǎn)ThreadedNode node = root;while (node != null) {// 循環(huán)找到最開(kāi)始的節(jié)點(diǎn)while (node.leftType == 0) {node = node.leftNode;}// 打印當(dāng)前節(jié)點(diǎn)的值System.out.println(node.value);// 如果當(dāng)前節(jié)點(diǎn)的右指針指向的是后繼節(jié)點(diǎn),// 可能后繼節(jié)點(diǎn)還有后繼節(jié)點(diǎn)、while (node.rightType == 1) {node = node.rightNode;System.out.println(node.value);}// 替換遍歷的節(jié)點(diǎn)node = node.rightNode;}}// 設(shè)置根節(jié)點(diǎn)public void setRoot(ThreadedNode root) {this.root = root;}// 中序線索化二叉樹(shù)-遞歸遍歷-節(jié)點(diǎn)public void threadNodes() {threadNodes(root);}// 中序線索化二叉樹(shù)-遞歸遍歷-根據(jù)root節(jié)點(diǎn)不斷遞歸public void threadNodes(ThreadedNode node) {// 當(dāng)前節(jié)點(diǎn)如果為null,直接返回if (node == null) {return;}// 處理左子樹(shù)---左子樹(shù)為空,指針指向前驅(qū)節(jié)點(diǎn)threadNodes(node.leftNode);// 處理前驅(qū)節(jié)點(diǎn)if (node.leftNode == null) {// 讓當(dāng)前節(jié)點(diǎn)的左指針指向前驅(qū)節(jié)點(diǎn)node.leftNode = pre;// 改變當(dāng)前節(jié)點(diǎn)左指針的類(lèi)型node.leftType = 1;// 指向前驅(qū)節(jié)點(diǎn)}// 處理前驅(qū)的右指針,如果前驅(qū)節(jié)點(diǎn)的右指針是null(沒(méi)有指向右子樹(shù))if (pre != null && pre.rightNode == null) {// 讓前驅(qū)節(jié)點(diǎn)的右指針指向當(dāng)前節(jié)點(diǎn)pre.rightNode = node;// 改變前驅(qū)節(jié)點(diǎn)的右指針類(lèi)型pre.rightType = 1;}// 每處理一個(gè)節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)是下一個(gè)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)pre = node;// 處理右子樹(shù)threadNodes(node.rightNode);}// 獲取根節(jié)點(diǎn)public ThreadedNode getRoot() {return root;}// 前序遍歷public void frontShow() {if (root != null) {root.frontShow();}}// 中序遍歷public void midShow() {if (root != null) {root.midShow();}}// 后序遍歷public void afterShow() {if (root != null) {root.afterShow();}}// 前序查找public ThreadedNode frontSearch(int i) {return root.frontSearch(i);}// 刪除子樹(shù)public void delete(int i) {if (root.value == i) {root = null;} else {root.delete(i);}}}

3、ThreadedNode.java

package demo7;public class ThreadedNode {int value;// 節(jié)點(diǎn)的權(quán)ThreadedNode leftNode;// 左兒子ThreadedNode rightNode;// 右兒子// 標(biāo)識(shí)指針類(lèi)型-默認(rèn)值為0,指向左右子樹(shù)int leftType;int rightType;public ThreadedNode(int value) {this.value = value;}// 設(shè)置左兒子public void setLeftNode(ThreadedNode leftNode) {this.leftNode = leftNode;}// 設(shè)置右兒子public void setRightNode(ThreadedNode rightNode) {this.rightNode = rightNode;}// 前序遍歷public void frontShow() {// 先遍歷當(dāng)前節(jié)點(diǎn)的內(nèi)容System.out.println(value);// 左節(jié)點(diǎn)if (leftNode != null) {leftNode.frontShow();}// 右節(jié)點(diǎn)if (rightNode != null) {rightNode.frontShow();}}// 中序遍歷public void midShow() {// 左子節(jié)點(diǎn)if (leftNode != null) {leftNode.midShow();}// 當(dāng)前節(jié)點(diǎn)System.out.print(value + "、");// 右子節(jié)點(diǎn)if (rightNode != null) {rightNode.midShow();}}// 后序遍歷public void afterShow() {// 左子節(jié)點(diǎn)if (leftNode != null) {leftNode.afterShow();}// 右子節(jié)點(diǎn)if (rightNode != null) {rightNode.afterShow();}// 當(dāng)前節(jié)點(diǎn)System.out.println(value);}// 前序查找public ThreadedNode frontSearch(int i) {ThreadedNode target = null;// 對(duì)比當(dāng)前節(jié)點(diǎn)的值if (this.value == i) {return this;// 當(dāng)前節(jié)點(diǎn)的值不是要查找的節(jié)點(diǎn)} else {// 查找左兒子if (leftNode != null) {// 有可能可以查到,也可以查不到,查不到的話(huà),target還是一個(gè)nulltarget = leftNode.frontSearch(i);}// 如果不為空,說(shuō)明在左兒子中已經(jīng)找到if (target != null) {return target;}// 查找右兒子if (rightNode != null) {target = rightNode.frontSearch(i);}}return target;}// 刪除一個(gè)子樹(shù)public void delete(int i) {ThreadedNode parent = this;// 判斷左兒子if (parent.leftNode != null && parent.leftNode.value == i) {parent.leftNode = null;return;}// 判斷右兒子if (parent.rightNode != null && parent.rightNode.value == i) {parent.rightNode = null;return;}// 遞歸檢查并刪除左兒子parent = leftNode;if (parent != null) {parent.delete(i);}// 遞歸檢查并刪除右兒子parent = rightNode;if (parent != null) {parent.delete(i);}}}

P39-4.12線索二叉樹(shù)的遍歷

不需要 使用 遞歸!!!

總結(jié)

以上是生活随笔為你收集整理的数据结构Java05【二叉树概述、二叉树遍历、堆排序、线索二叉树实现及遍历】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美黄色a级大片 | 中文字幕精品一区 | 男人天堂免费视频 | 人人cao | 欧美黑人又粗又大的性格特点 | 欧美日韩欧美日韩在线观看视频 | 啪啪网页 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 1000部啪啪未满十八勿入 | 亚洲精品乱码久久久久久麻豆不卡 | 黄色一级大片 | 亚洲天堂中文字幕在线 | 国产精品一区二区电影 | 国产在线观看无码免费视频 | 国内av在线播放 | 国产夫妻性生活 | 97毛片 | 国产人妖一区二区三区 | 午夜私人福利 | 九色porny自拍视频 | aa亚洲| 久久九九精品 | 99热在线观看免费精品 | 香蕉伊人网 | 97视频久久 | 国产男人天堂 | 国产91综合一区在线观看 | 国产精品videos | 麻豆av免费在线 | 无码人妻精品一区二区三区99日韩 | 国模在线 | 四虎影视成人永久免费观看亚洲欧美 | 又黄又爽的视频在线观看 | 性无码专区无码 | 欧美性受xxxx黑人xyx性 | 涩涩在线看 | 亚洲精品免费在线观看 | 啄木乌欧美一区二区三区 | 粉嫩av在线 | 亚洲人高潮女人毛茸茸 | 99久久精品日本一区二区免费 | 久久久久久穴 | 91午夜精品 | 国产成人精品999在线观看 | 九七伦理电影 | 亚洲性生活视频 | 国产美女激情 | 欧美人与禽zozzo性之恋的特点 | 久久亚洲AV成人无码一二三 | 亚洲国产精品国自产拍av | 欧美综合图区 | 最新在线中文字幕 | 中国毛片网站 | 91无套直看片红桃 | 国产欧美高清 | 免费毛片大全 | proumb性欧美在线观看 | 国产中文字幕第一页 | 一本大道久久a久久精二百 琪琪色在线视频 | 亚洲www | 久久99久| 午夜在线精品偷拍 | 国产a级免费视频 | 97欧美视频 | 91精品视频免费观看 | 好看的黄色录像 | 亚洲 激情 小说 另类 欧美 | 六月丁香激情网 | 久久久精品免费视频 | 制服av在线| 波多野结衣一区 | 国产精久久久久 | 亚洲福利在线播放 | 亚洲色偷精品一区二区三区 | 五月综合久久 | 狠狠干干 | 午夜久久久久久噜噜噜噜 | 激情视频网站在线观看 | 欧美成人福利视频 | 成人激情免费 | www.youjizz.com亚洲| 免费黄色一级大片 | 日本精品一二三 | 香蕉在线影院 | 亚洲免费看av | 欧美日韩小视频 | 免费看黄色三级 | 久草中文在线视频 | 国产精品成人午夜视频 | 人妻洗澡被强公日日澡电影 | 草久在线 | 毛片a级片 | 综合色伊人| 法国空姐 在线 | 亚洲激情电影在线 | 天天干天天透 | 成人性生交7777 | 亚洲一区二区三区人妻 | 久久久久久久香蕉 |