最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java有序二叉樹的刪除節(jié)點方式

 更新時間:2024年12月17日 08:57:34   作者:Sshm_666  
文章描述了在二叉樹中刪除節(jié)點的三種情況及其對應的操作步驟,通過遞歸找到節(jié)點及其父節(jié)點,并根據(jù)節(jié)點的子樹情況(無子樹、單子樹、雙子樹)進行相應的刪除操作,文章還提供了一個測試類來驗證刪除操作的正確性

java有序二叉樹的刪除節(jié)點

刪除節(jié)點時會有三種可能

1、刪除的節(jié)點為葉子節(jié)點

我們?nèi)绻麆h除為葉子節(jié)點,則步驟應該是:

1)先找到要刪除的葉子節(jié)點

2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)

3)找到刪除的節(jié)點是父節(jié)點的左子樹還是右子樹

4)根據(jù)前面的情況進行刪除

2、刪除的節(jié)點只有一個子樹

步驟:

1)先找到要刪除的節(jié)點

2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)

3)確定刪除的節(jié)點是有左子樹還是有右子樹

4)找到刪除的節(jié)點是父節(jié)點的左子樹還是右子樹

5)根據(jù)前面的情況進行刪除

3、刪除的節(jié)點有兩個子樹

步驟:

1)先找到要刪除的節(jié)點

2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)

3)找到刪除節(jié)點右子樹當中最小的或左子樹最大的節(jié)點

4)將3)找到的這個節(jié)點的值替換掉要刪除的節(jié)點的值

5)刪除找到的3)

通過上面步驟它們都有一個共同特點就是需要找到刪除的節(jié)點和要刪除節(jié)點的父節(jié)點,所以我們可以把這兩個找節(jié)點都寫成方法:

找到刪除節(jié)點代碼如下(通過遞歸的方式找到要刪除節(jié)點位置并記錄下來):

//找到要刪除的節(jié)點
	public TreeNode searchDelnode(TreeNode node,Integer val) {
		if(node==null) {
			return null;
		}
		if(node.val==val) {
			return node;
		}else if(val>node.val){
			if(node.rightNode==null) {
				return null;
			}
			return searchDelnode(node.rightNode, val);
		}else {
			if(node.leftNode==null) {
				return null;
			}
			return searchDelnode(node.leftNode, val);
		}
	}

找被刪除節(jié)點的父節(jié)點代碼如下所示:

//找到要刪除節(jié)點的父節(jié)點
	public TreeNode searchDelpartent(TreeNode node,Integer val) {
		if(node==null) {
			return null;
		}
		if((node.leftNode!=null&&node.leftNode.val==val)||(node.rightNode!=null&&node.rightNode.val==val)) {
			return node;
		}else {
			if(node.leftNode!=null&&val<node.val) {
				return searchDelpartent(node.leftNode, val);
			}else if(node.rightNode!=null&&val>node.val){
				return searchDelpartent(node.rightNode, val);
			}else {
				return null;
			}
		}
	}

我們可以根據(jù)以上步驟寫刪除方法代碼:

//二叉樹刪除節(jié)點
	public void del(TreeNode node,Integer val) {
		if(node==null) {
			return;
		}
		//1.找到要刪除的節(jié)點
		TreeNode targetNode=searchDelnode(node, val);
		//2.沒有找到要刪除的節(jié)點
		if(targetNode==null) {
			return;
		}
		//3.找到要刪除節(jié)點的父節(jié)點
		TreeNode parentNode=searchDelpartent(node, val);
		if(node.rightNode==null&&node.leftNode==null) {
			root=null;
			return;
		}
		if(parentNode==null&&(targetNode.rightNode!=null||targetNode.leftNode!=null)) {
			int min=searchRightMin(targetNode.rightNode);
			targetNode.val=min;
			return;
		}
		if(targetNode.leftNode==null&&targetNode.rightNode==null) {
			if(parentNode.rightNode!=null&&parentNode.rightNode.val==targetNode.val) {
				parentNode.rightNode=null;
			}else if(parentNode.leftNode!=null&&parentNode.leftNode.val==val){
				parentNode.leftNode=null;
			}
		}else if(targetNode.leftNode!=null&&targetNode.rightNode!=null) {
//在刪除節(jié)點由左右兩個子樹時,我們選擇找刪除節(jié)點右子樹的最小值,我們可以寫一個方法,在這個方法里不僅找到最小值,并把這個位置的元素進行刪除
			int min=searchRightMin(targetNode.rightNode);
			targetNode.val=min;
		}else {
			if(targetNode.rightNode!=null) {
				if(parentNode.rightNode.val==targetNode.val) {
					parentNode.rightNode=targetNode.rightNode;
				}else {
					parentNode.leftNode=targetNode.rightNode;
				}
			}else{
				if(targetNode.rightNode.val==targetNode.val) {
					parentNode.rightNode=targetNode.leftNode;
				}else {
					parentNode.leftNode=targetNode.leftNode;
				}
			}
		}
	}

在刪除節(jié)點由左右兩個子樹時,我們選擇找刪除節(jié)點右子樹的最小值,我們可以寫一個方法,在這個方法里不僅找到最小值,并把這個位置的元素進行刪除

代碼如下:

public int searchRightMin(TreeNode node) {
		TreeNode temp=node;
		while(temp.leftNode!=null) {
			temp=temp.leftNode;
		}
		del(root, temp.val);
		return temp.val;
	}
}

寫一個測試類進行測試:

public class Test {
	public static void main(String[] args) {
		BinaryTree binaryTree=new BinaryTree();
		binaryTree.insert(1);
		binaryTree.insert(2);
		binaryTree.insert(3);
		binaryTree.insert(4);
		binaryTree.insert(5);
		binaryTree.insertDigui(6, binaryTree.root);
		binaryTree.insertDigui(7, binaryTree.root);
		binaryTree.insertDigui(8, binaryTree.root);
		binaryTree.insertDigui(9, binaryTree.root);
		binaryTree.del(binaryTree.root, 2);
		binaryTree.Order();
		System.out.println();
		binaryTree.startErgodic(binaryTree.root);
		System.out.println();
		binaryTree.midErgodic(binaryTree.root);
		System.out.println();
		binaryTree.endErgodic(binaryTree.root);
	}
}

結果如下圖所示:

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring MVC學習教程之RequestMappingHandlerAdapter詳解

    Spring MVC學習教程之RequestMappingHandlerAdapter詳解

    這篇文章主要給大家介紹了關于Spring MVC學習教程之RequestMappingHandlerAdapter的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-11-11
  • Java?Thread中join方法使用舉例詳解

    Java?Thread中join方法使用舉例詳解

    Java Thread中join()方法主要是讓調用改方法的thread完成run方法里面的東西后,在執(zhí)行join()方法后面的代碼,這篇文章主要介紹了Java?Thread中join方法使用的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-07-07
  • 記一次springboot服務凌晨無故宕機問題的解決

    記一次springboot服務凌晨無故宕機問題的解決

    這篇文章主要介紹了記一次springboot服務凌晨無故宕機問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring boot項目部署到云服務器小白教程詳解

    Spring boot項目部署到云服務器小白教程詳解

    這篇文章主要介紹了Spring boot項目部署到云服務器小白教程詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java?并發(fā)編程之深入理解"鎖可中斷"機制

    Java?并發(fā)編程之深入理解"鎖可中斷"機制

    在Java并發(fā)編程中,死鎖(Deadlock)和線程阻塞(Blocking)是開發(fā)者最頭疼的問題之一,本文給大家介紹Java?并發(fā)編程之深入理解“鎖可中斷”機制,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • SpringBoot項目上高并發(fā)問題的解決方案

    SpringBoot項目上高并發(fā)問題的解決方案

    本章演示在springboot項目中的高并發(fā)demo,演示導致的問題,以及單機部署下的解決方案和集群部署下的解決方式以及分布式下的解決方案,文中通過圖文結合的方式講解的非常詳細,需要的朋友可以參考下
    2024-06-06
  • SpringBoot中配置屬性熱更新的輕量級實現(xiàn)方案

    SpringBoot中配置屬性熱更新的輕量級實現(xiàn)方案

    項目開發(fā)中,每次修改配置都要重啟服務,不僅開發(fā)效率低,線上重啟還會導致短暫不可用,今天分享一個輕量級方案,基于SpringBoot原生能力實現(xiàn)配置熱更新,有需要的可以了解下
    2025-07-07
  • 如何在 Java 中利用 redis 實現(xiàn) LBS 服務

    如何在 Java 中利用 redis 實現(xiàn) LBS 服務

    基于位置的服務,是指通過電信移動運營商的無線電通訊網(wǎng)絡或外部定位方式,獲取移動終端用戶的位置信息,在GIS平臺的支持下,為用戶提供相應服務的一種增值業(yè)務。下面我們來一起學習一下吧
    2019-06-06
  • Java逃逸分析詳解及代碼示例

    Java逃逸分析詳解及代碼示例

    這篇文章主要介紹了Java逃逸分析詳解及代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

西畴县| 宝清县| 稻城县| 襄垣县| 西乌珠穆沁旗| 海淀区| 通化县| 河北省| 新巴尔虎左旗| 祁门县| 镇远县| 新和县| 浙江省| 漳浦县| 沂南县| 陵川县| 巴东县| 望城县| 乌拉特中旗| 陆良县| 尚义县| 梓潼县| 福鼎市| 东至县| 囊谦县| 崇信县| 潍坊市| 墨江| 托克托县| 泸州市| 姜堰市| 康马县| 琼海市| 贡山| 慈利县| 周口市| 隆德县| 泰和县| 岳阳县| 大洼县| 洛阳市|