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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【二叉树详解】二叉树的创建、遍历、查找以及删除等-数据结构05

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【二叉树详解】二叉树的创建、遍历、查找以及删除等-数据结构05 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二叉樹

1. 二叉樹簡介

定義: 每一個結點的子節點數量不超過 2

二叉樹的結點分為:左節點、右節點

滿二叉樹: 每個結點都有兩個子結點的二叉樹(除了葉子結點外)

完全二叉樹: 除去最后一層,是一個滿二叉樹,并且最后一層結點左連續

(從左到右,從上到下,依次編號1,2,3,4…,這樣的編號和滿二叉樹一一對應的二叉樹叫完全二叉樹)

2. 鏈式存儲的二叉樹

2.1 創建二叉樹

思路: 首先必須有一個BinaryTree 二叉樹的類-用于設置根節點(也可以是一顆空樹)

? 其次需要結點 TreeNode 來構建二叉樹

? 結點包含:value結點值、leftNode左節點、rightNode右節點 以及設置/獲取左右節點的方法

創建一個如下圖的二叉樹


具體化以后:

代碼:

//二叉樹 public class BinaryTree {//根節點TreeNode root;//設置根節點、獲取根節點public TreeNode getRoot() {return root;}public void setRoot(TreeNode root) {this.root = root;} } //樹的結點 public class TreeNode {//結點的值int value;//左節點TreeNode leftNode;//右節點TreeNode rightNode;//初始化值public TreeNode(int value){this.value=value;}//設置左節點public void setLeftNode(TreeNode leftNode) {this.leftNode = leftNode;}//設置右節點public void setRightNode(TreeNode rightNode) {this.rightNode = rightNode;} }

測試類:

public class TestBinaryTree {public static void main(String[] args) {//創建一顆空二叉樹BinaryTree binaryTree = new BinaryTree();//創建根結點TreeNode root=new TreeNode(1);binaryTree.setRoot(root);//創建根結點的左節點和右節點TreeNode leftNode = new TreeNode(2);TreeNode RightNode = new TreeNode(3);//將左右結點連接在根結點后root.setLeftNode(leftNode);root.setRightNode(RightNode);} }

2.2 遍歷二叉樹

三種遍歷方式: 前序遍歷、中序遍歷、后續遍歷

(這里的前中后,都是對于當前結點而言)

前序遍歷-當前結點在左右結點的前面:簡記為 “根左右”

中序遍歷-當前結點在左右結點的中間-“左根右”

后序遍歷-當前結點在左右結點的后面-“左右根”

舉個栗子:

前序遍歷:1 2 4 5 3 6 7

中序遍歷:4 2 5 1 6 3 7

后序遍歷:4 5 2 6 7 3 1

代碼實現:

TreeNode.java 中 (代碼沒有前部寫出,前面已經寫過的代碼略)

//前序遍歷public void frontShow(){//遍歷當前節點System.out.print(value+" ");//遍歷左節點if(leftNode!=null){leftNode.frontShow();}//遍歷右節點if(rightNode!=null){rightNode.frontShow();}}//中序遍歷public void midShow(){//遍歷左子節點if(leftNode!=null){leftNode.midShow();}//遍歷當前節點System.out.print(value+" ");//遍歷右子節點if(rightNode!=null){rightNode.midShow();}}//后序遍歷public void afterShow(){//遍歷左子節點if(leftNode!=null){leftNode.afterShow();}//遍歷右子節點if(rightNode!=null){rightNode.afterShow();}//遍歷當前節點System.out.print(value+" ");}

BinaryTree中實現封裝:

//前中后序遍歷public void frontShow(){root.frontShow();}public void midShow(){root.midShow();}public void afterShow(){root.afterShow();}

測試:

public class TestBinaryTree {public static void main(String[] args) {//創建一顆空二叉樹BinaryTree binaryTree = new BinaryTree();//創建根結點TreeNode root=new TreeNode(1);binaryTree.setRoot(root);//創建根結點的左節點和右節點TreeNode leftNode = new TreeNode(2);TreeNode rightNode = new TreeNode(3);//將左右結點連接在根結點后root.setLeftNode(leftNode);root.setRightNode(rightNode);//增加四個節點 4、5、6、7方便遍歷leftNode.setLeftNode(new TreeNode(4));leftNode.setRightNode(new TreeNode(5));rightNode.setLeftNode(new TreeNode(6));rightNode.setRightNode(new TreeNode(7));//前序、中序、后序遍歷System.out.print("前序遍歷:");binaryTree.frontShow();System.out.print("\n中序遍歷:");binaryTree.midShow();System.out.print("\n后序遍歷:");binaryTree.afterShow();System.out.println();} }

結果:

前序遍歷:1 2 4 5 3 6 7 中序遍歷:4 2 5 1 6 3 7 后序遍歷:4 5 2 6 7 3 1

可以看到和我們上面分析的結果一模一樣

2.3 二叉樹結點的查找

三種查找方式:前序、中序、后序查找
和遍歷差不多,不同的是傳入一個要查找的值,并且返回目標結點

三種查找實現差不多,只是查找順序不同

代碼:

//前序查找public TreeNode frontSearch(int value){//目標節點TreeNode target=null;//先查找當前結點,如果值相同直接返回if(this.value==value){return this;}//查找左子節點if(leftNode!=null){target = leftNode.frontSearch(value);//如果左子節點返回的值不為空,則找到,直接返回if(target!=null){return target;}}//查找右子節點if(rightNode!=null){target = rightNode.frontSearch(value);}//返回return target;}//中序查找public TreeNode midSearch(int value){//目標節點TreeNode target=null;//先查找左子節點if(leftNode!=null){target = leftNode.midSearch(value);//如果左子節點返回的值不為空,則找到,直接返回if(target!=null){return target;}}//再查找當前結點,如果值相同直接返回if(this.value==value){return this;}//最后查找右子節點if(rightNode!=null){target = rightNode.midSearch(value);}//返回return target;}//后序查找public TreeNode afterSearch(int value){//目標節點TreeNode target=null;//先查找左子節點if(leftNode!=null){target = leftNode.afterSearch(value);//如果左子節點返回的值不為空,則找到,直接返回if(target!=null){return target;}}//再查找右子節點if(rightNode!=null){target = rightNode.afterSearch(value);if(target!=null){return target;}}//最后查找當前結點,如果值相同直接返回if(this.value==value){target=this;}//返回return target;}

BinaryTree中實現封裝:

//前中后序查找public TreeNode frontSearch(int value){return root.frontSearch(value);}public TreeNode midSearch(int value){return root.midSearch(value);}public TreeNode afterSearch(int value){return root.afterSearch(value);}

測試:

//查找 System.out.println(binaryTree.frontSearch(3)==rightNode); System.out.println(binaryTree.midSearch(6)); System.out.println(binaryTree.afterSearch(7));

結果:

true com.dong.DataStructrue.Day_06.TreeNode@1554909b com.dong.DataStructrue.Day_06.TreeNode@6bf256fa

可以看到,無論用什么查找方式都可以找到樹中有的結點

2.4 刪除結點(子樹)

思路: 想刪除一個結點,可以讓其父節點指向它的TreeNode為null即可

? 當刪除的不是葉子節點,相當于刪除子樹

注意: 以下的刪除方法只適用于 結點值不重復時

代碼:

BinaryTree

//刪除結點(子樹)public void delete(int value){if(root!=null){//如果根節點是要刪除的結點直接刪除if(root.value==value){root=null;}else{//遞歸root.delete(value);}}else{System.out.println("當前是一顆空樹,無法刪除!");}}

TreeNode:

//刪除結點(子樹)public void delete(int value) {//存儲父節點TreeNode parentNode=this;//判斷左子節點if(parentNode.leftNode!=null&&parentNode.leftNode.value==value){//刪除parentNode.leftNode=null;return;}//判斷右節點if(parentNode.rightNode!=null&&parentNode.rightNode.value==value){//刪除parentNode.rightNode=null;return;}//將左節點作為父節點,遞歸刪除parentNode=leftNode;if(parentNode!=null){parentNode.delete(value);}//將右節點作為父節點,遞歸刪除parentNode=rightNode;if(parentNode!=null){parentNode.delete(value);}}

測試:

//刪除結點 System.out.print("刪除前:"); binaryTree.frontShow(); System.out.println(); //這里4、7都是刪除兩個葉子結點 System.out.print("刪除4:"); binaryTree.delete(4); binaryTree.frontShow(); System.out.println();System.out.print("刪除7:"); binaryTree.delete(7); binaryTree.frontShow(); System.out.println(); //這里相當于刪除了子樹 System.out.print("刪除2:"); binaryTree.delete(2); binaryTree.frontShow();

結果:

刪除前: 1 2 4 5 3 6 7 刪除41 2 5 3 6 7 刪除71 2 5 3 6 刪除21 3 6

3. 順序存儲的二叉樹

思路:使用數組來存儲,通過數組下標關系來找到左節點和右節點以及父節點,從而實現順序存儲二叉樹

代碼:

public class ArrayBinaryTree {//存儲數據int[] data;public ArrayBinaryTree(int[] data) {this.data = data;}//不傳參數,默認從0開始遍歷public void frontShow(){frontShow(0);}//前序遍歷,傳入參數-從哪個下標開始遍歷public void frontShow(int index){//當數據為空時if(data.length==0||data==null){System.out.print("當前為空樹");return;}System.out.print(data[index]+" ");//遍歷左節點=index*2+1if(index*2+1<data.length){frontShow(index*2+1);}//遍歷右節點=index*2+2if(index*2+2<data.length){frontShow(index*2+2);}} }

測試:

public class TestArrayBinaryTree {public static void main(String[] args) {//創建數組,傳入值int[] data=new int[]{1,2,3,4,5,6,7};ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(data);//前序遍歷,從0開始System.out.print("前序遍歷:");arrayBinaryTree.frontShow();} }

結果:

前序遍歷: 1 2 4 5 3 6 7

總結

以上是生活随笔為你收集整理的【二叉树详解】二叉树的创建、遍历、查找以及删除等-数据结构05的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一级大片 | 老牛影视av牛牛影视av | 欧洲一区二区 | 欧美成人免费一级人片100 | av资源免费观看 | av在线不卡播放 | 亚洲成人一区二区 | 秋霞网av | 久久有精品 | 91麻豆精品国产91久久久久久 | 台湾a级艳片潘金莲 | 男女激情在线观看 | 99re在线播放 | 神马久久久久久久久 | 在线观看免费黄网站 | 成人午夜视频网站 | 久久精品99久久久久久 | 69毛片| 中国女人毛茸茸 | 91亚洲网站 | 久久综合亚洲色hezyo国产 | 中国毛片网站 | 欧美色悠悠 | 欧美 日韩 国产 激情 | 中国少妇乱子伦视频播放 | 国产aⅴ精品 | 一级黄色性片 | 色版视频在线观看 | 成人黄色短片 | 欧美人成在线 | 日韩日韩日韩日韩日韩 | 在线超碰av | 国产精品婷婷午夜在线观看 | 欧美亚洲综合视频 | 国产精品爽爽 | 在线成人一区 | 护士的小嫩嫩好紧好爽 | 日韩久久电影 | 不卡一区二区在线观看 | 黄色a级免费 | 韩国精品在线 | 色丁香在线 | 欧美在线色 | 日韩av女优在线观看 | 伊人88 | a天堂资源在线观看 | 非洲一级黄色片 | 黄色小视频大全 | 午夜一区二区三区在线 | 日韩视频 中文字幕 | 欧美黄色精品 | 精品一区二区三区无码视频 | 91精品国产色综合久久不卡蜜臀 | 97久久精品人人澡人人爽 | 4438激情网| 啪啪精品 | 国产精品久久久久av | 欧美日韩视频在线观看一区 | 综合国产一区 | 91一区二区国产 | 激情欧美综合 | 91精品国产91久久久久福利 | 亚洲av永久一区二区三区蜜桃 | 日韩欧美在线一区二区三区 | 高h喷水荡肉少妇爽多p视频 | 黄色小视频在线免费观看 | 中文av一区 | 成人一级片 | 国产91传媒 | 免费久久av | 日韩天天操 | 午夜一区二区三区在线 | 91素人约啪| 雨宫琴音一区二区三区 | 日韩在线观看免费av | 一本色道久久综合亚洲精品图片 | 国产又粗又猛又爽又黄91 | 91精品系列 | 亚洲经典久久 | 国产三级视频在线播放 | 国产99在线视频 | 国偷自产av一区二区三区 | 大香伊人久久 | 67194午夜 | 中文字幕一区二区久久人妻网站 | 欧美成人精品在线 | 亚欧在线免费观看 | 秋霞影院一区二区 | 伊人影院在线观看视频 | 欧美日韩精品在线视频 | 香港日本韩国三级网站 | 日韩每日更新 | 久久久久久9999 | 欧美一级做 | 成人欧美一区二区三区黑人 | 国产在线视频91 | 天天网综合 | 永久av在线免费观看 | 亚洲а∨天堂久久精品2021 |