亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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);
	}
}

結(jié)果如下圖所示:

總結(jié)

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

相關文章

  • springboot啟動mongoDB報錯之禁用mongoDB自動配置問題

    springboot啟動mongoDB報錯之禁用mongoDB自動配置問題

    這篇文章主要介紹了springboot啟動mongoDB報錯之禁用mongoDB自動配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 總結(jié)一些Java常用的加密算法

    總結(jié)一些Java常用的加密算法

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Java加密算法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 實例講解Java批量插入、更新數(shù)據(jù)

    實例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個Java批量添加數(shù)據(jù),多個字段同時添加多條數(shù)據(jù)具體實例,面向的是Oracle數(shù)據(jù)庫,需要的朋友可以參考下
    2015-07-07
  • mybatis-plus實現(xiàn)多表查詢的示例代碼

    mybatis-plus實現(xiàn)多表查詢的示例代碼

    MyBatis-Plus提供了多種方式實現(xiàn)多表查詢,包括使用注解、MyBatis-PlusJoin擴展和XML配置文件,每種方法都有其適用場景和優(yōu)勢,本文就來具體介紹一下,感興趣的可以了解一下
    2024-11-11
  • Java實現(xiàn)批量下載選中文件功能

    Java實現(xiàn)批量下載選中文件功能

    這篇文章主要介紹了Java實現(xiàn)批量下載選中文件功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 如何利用postman完成JSON串的發(fā)送功能(springboot)

    如何利用postman完成JSON串的發(fā)送功能(springboot)

    這篇文章主要介紹了如何利用postman完成JSON串的發(fā)送功能(springboot),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java數(shù)據(jù)結(jié)構之圖的原理與實現(xiàn)

    Java數(shù)據(jù)結(jié)構之圖的原理與實現(xiàn)

    圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。本文將詳細介紹圖的原理及其代碼實現(xiàn),需要的可以參考一下
    2022-01-01
  • 模仿Spring手寫一個簡易的IOC

    模仿Spring手寫一個簡易的IOC

    這篇文章主要介紹了模仿Spring手寫一個簡易的IOC,幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下
    2020-11-11
  • 使用IDEA創(chuàng)建SpringBoot項目

    使用IDEA創(chuàng)建SpringBoot項目

    本文詳細介紹了使用SpringBoot創(chuàng)建項目,包含配置、啟動、開發(fā)環(huán)境配置等,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • Java實現(xiàn)企業(yè)員工管理系統(tǒng)

    Java實現(xiàn)企業(yè)員工管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)企業(yè)員工管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論