Java-二叉排序樹的刪除
考慮情況
二叉排序樹的刪除情況比較複雜,有下面三種情況要考慮
1.刪除葉子節點
2.刪除只有一顆子樹的節點
3.刪除有兩顆子樹的節點
思路分析
第一種情況:刪除葉子節點
思路:
1.需求先去找到要刪除的節點targetNode
2.找到targetNode的父節點parent
3.確定targetNode是parent的左子節點還是右子節點
4.根據情況對應刪除
第二種情況:刪除只有一顆子樹的節點
思路:
1.需求先去找到要刪除的節點targetNode
2.找到targetNode的父節點parent
3.確定targetNode的子節點是左子節點還是右子節點
4.確定targetNode是parent的左子節點還是右子節點
5.如果targetNode有左子節點
5.1如果targetNode是parent的左子節點,parent.left=targetNode.left。
5.2如果targetNode是parent的右子節點,parent.right=targetNode.left。
6.如果targeyNode有右子節點
6.1如果targetNode是parent的左子節點,parent.left=targetNode.right.
6.2如果targetNode是parent的右子節點,parent.right=targetNode.right
第三種情況:刪除有兩顆子樹的節點
思路:
1.需求先去找到要刪除的節點targetNode
2.找到targetNode的父節點parent
3.從targetNode的右子樹找到最小的節點
4.用一個臨時變數,將最小節點的值儲存
5.刪除該最小節點
6.targetNode.value=temp
程式碼實現
//查詢要刪除的節點
public Nodes search(int value) {
if(value==this.value) {
return this;
}else if(value<this.value) {//如果查詢值小於當前節點,則向左子樹遞迴查詢
//如果左子節點為空
if(this.left==null) {
return null;
}
return this.left.search(value);
}else {
if(this.right==null) {
return null;
}
return this.right.search(value);
}
}
//查詢要刪除節點的父節點
public Nodes searchParent(int value) {
//如果當前節點就是要刪除節點的父節點,就返回
if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value)) {
return this;
}else {
//如果查詢的值小於當前節點的值,並且當前節點的左子節點不為空
if(value<this.value&&this.left!=null) {
return this.left.searchParent(value);
}else if(value>=this.value&&this.right!=null){
return this.right.searchParent(value);
}else {
return null;//沒有找到父節點
}
}
}
public Nodes search(int value) {
if(root==null) {
return null;
}else {
return root.search(value);
}
}
//查詢父節點
public Nodes searchParent(int value) {
if(root==null) {
return null;
}else {
return root.searchParent(value);
}
}
//刪除節點
public void delNode(int value) {
if(root==null) {
return;
}else {
//先找到要刪除的節點
Nodes targetNode=search(value);
//如果沒有找到要刪除的節點
if(targetNode==null) {
return;
}
//如果我們發現當前的二叉樹只有一個節點
if(root.left==null&&root.right==null) {
root=null;
return;
}
//去找到targetNode的父節點
Nodes parent=searchParent(value);
//如果要刪除的是葉子節點
if(targetNode.left==null&&targetNode.right==null) {
//判斷targetNode是父節點的左子節點還是右子節點
if(parent.left!=null&&parent.left.value==value) {
parent.left=null;
}else if(parent.right==null&&parent.right.value==value) {
parent.right=null;
}
}else if(targetNode.left!=null&&targetNode.right!=null) {//刪除有兩顆子樹的節點
int minValue=delRightTreeMin(targetNode.right);
targetNode.value=minValue;
}else {//刪除只有一顆子樹的節點
//如果要刪除的節點有左子節點
if(targetNode.left!=null) {
//如果targetNode是parent的左子節點
if(parent.left.value==value) {
parent.left=targetNode.left;
}else {
parent.right=targetNode.left;
}
}else {//要刪除的節點有右子節點
if(parent.left.value==value) {
parent.left=targetNode.right;
}else {
parent.right=targetNode.right;
}
}
}
}
}
//查詢最小節點
public int delRightTreeMin(Nodes node) {
Nodes target=node;
while(target.left!=null) {
target=target.left;
}
delNode(target.value);
return target.value;
}
相關文章
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉查詢樹的插入刪除查詢
- 二叉搜尋樹如何刪除節點
- Java實現二叉搜尋樹的插入、刪除Java
- 排序二叉樹和平衡二叉樹排序二叉樹
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- 使用 O(1) 額外記憶體刪除二叉樹記憶體二叉樹
- 實現二叉搜尋樹的新增,查詢和刪除(JAVA)Java
- 二叉排序樹 oj 2482排序
- js之排序二叉樹JS排序二叉樹
- Java-排序Java排序
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 智慧指標和二叉樹(3):圖解查詢和刪除指標二叉樹圖解
- 二叉排序樹BST及CRUD操作排序
- 紅黑樹新增刪除
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- Python實現二叉樹的增、刪、查Python二叉樹
- 使用javascript實現排序二叉樹(2)JavaScript排序二叉樹
- 使用javascript實現排序二叉樹(1)JavaScript排序二叉樹
- 刪除排序陣列中的重複項排序陣列
- 用Python實現二叉樹的增、刪、查Python二叉樹
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 一文搞定二叉排序(搜尋)樹排序
- 【LeetCode二叉樹#17】在二叉搜尋樹中插入或刪除某個值(涉及重構二叉樹、連結串列基礎、以及記憶體洩漏問題)LeetCode二叉樹記憶體
- 程式碼隨想錄演算法訓練營第22天 |二叉樹part07:235. 二叉搜尋樹的最近公共祖先、701.二叉搜尋樹中的插入操作、450.刪除二叉搜尋樹中的節點演算法二叉樹
- leetcode 450. delete-node-in-a-bst 刪除二叉搜尋樹中的節點 python3LeetCodedeletePython
- C語言 遞迴實現二叉排序樹的插入C語言遞迴排序
- Python 樹表查詢_千樹萬樹梨花開,忽如一夜春風來(二叉排序樹、平衡二叉樹)Python排序二叉樹
- 題目:刪除排序陣列中的重複項排序陣列
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- Java基礎-理解紅黑樹(刪除)Java
- 第三章:查詢與排序(下)----------- 3.15基礎學習_樹、二叉樹、堆排序排序二叉樹
- 資料結構與演算法:二叉排序樹資料結構演算法排序
- Tree樹狀圖的動態增刪查改(下)修改與刪除
- 從未排序的連結串列中刪除重複項排序
- [12][02][26] 刪除排序陣列中的重複項排序陣列
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode
- 程式碼隨想錄演算法訓練營day19| 235. 二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法