Skip to content

Commit 5fa500b

Browse files
committed
[Function add]
1.Delete node in AVLTree.
1 parent 0b371fe commit 5fa500b

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

Algorithm(4th_Edition)/Notes/Tree/平衡二叉树BalancedBinaryTree.md

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
}
8888
```
8989

90+
## 插入
9091
* 插入结点
9192
```Java
9293
public void insert(V v){
@@ -139,4 +140,64 @@
139140
node.height = Math.max(height(node.left), height(node.right)) + 1;
140141
return node;
141142
}
142-
```
143+
```
144+
145+
## 删除节点
146+
```Java
147+
/**
148+
* @Description: Find the smallest sub-node of given node.
149+
* @param node
150+
* @return
151+
*/
152+
private AVLNode min(AVLNode node){
153+
if(node.left == null) return node;
154+
return min(node.left);
155+
}
156+
public void delete(V v){
157+
root = delete(root, v);
158+
}
159+
private AVLNode delete(AVLNode node, V v){
160+
if(null == node) return null;
161+
int cmp = v.compareTo(node.v);
162+
if(cmp < 0){
163+
//要删除的结点小于当前结点,继续从左结点删除。
164+
node.left = delete(node.left, v);
165+
//从子结点中删除,右子树的高度此时一定大于等于左子树。
166+
//R
167+
if(height(node.right) - height(node.left) == 2){
168+
AVLNode cur = node.right;
169+
if(height(cur.right) > height(cur.left)){
170+
//RR
171+
node = singleRotateLeft(node);
172+
}else{
173+
//RL
174+
node = doubleRotateRL(node);
175+
}
176+
}
177+
}else if(cmp > 0){
178+
//要删除的结点大于当前结点,继续从右结点删除。
179+
node.right = delete(node.right, v);
180+
//L
181+
if(height(node.left) - height(node.right) == 2){
182+
AVLNode cur = node.left;
183+
if(height(cur.left) > height(cur.right)){
184+
//LL
185+
node = singleRotateRight(node);
186+
}else{
187+
//LR
188+
node = doubleRotateLR(node);
189+
}
190+
}
191+
}else if(node.left != null && node.right != null){
192+
//已经找到要删除的结点并且当前结点不为叶结点。
193+
//替换要删除结点的值。
194+
node.v = min(node.right).v;
195+
node.right = delete(node.right, node.v);
196+
}else{
197+
//已找到要删除的结点,只有一棵子树。
198+
node = (node.left != null) ? node.left:node.right;
199+
}
200+
if(node != null) node.height = Math.max(height(node.left), height(node.right)) + 1;
201+
return node;
202+
}
203+
```

Algorithm(4th_Edition)/src/ca/mcmaster/chapter/three/bitree/BalancedBinaryTree.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,65 @@ private AVLNode insert(V v, AVLNode node){
124124
return node;
125125
}
126126

127+
/**
128+
* @Description: Find the smallest sub-node of given node.
129+
* @param node
130+
* @return
131+
*/
132+
private AVLNode min(AVLNode node){
133+
if(node.left == null) return node;
134+
return min(node.left);
135+
}
136+
137+
public void delete(V v){
138+
root = delete(root, v);
139+
}
140+
141+
private AVLNode delete(AVLNode node, V v){
142+
if(null == node) return null;
143+
int cmp = v.compareTo(node.v);
144+
if(cmp < 0){
145+
//要删除的结点小于当前结点,继续从左结点删除。
146+
node.left = delete(node.left, v);
147+
//从子结点中删除,右子树的高度此时一定大于等于左子树。
148+
//R
149+
if(height(node.right) - height(node.left) == 2){
150+
AVLNode cur = node.right;
151+
if(height(cur.right) > height(cur.left)){
152+
//RR
153+
node = singleRotateLeft(node);
154+
}else{
155+
//RL
156+
node = doubleRotateRL(node);
157+
}
158+
}
159+
}else if(cmp > 0){
160+
//要删除的结点大于当前结点,继续从右结点删除。
161+
node.right = delete(node.right, v);
162+
//L
163+
if(height(node.left) - height(node.right) == 2){
164+
AVLNode cur = node.left;
165+
if(height(cur.left) > height(cur.right)){
166+
//LL
167+
node = singleRotateRight(node);
168+
}else{
169+
//LR
170+
node = doubleRotateLR(node);
171+
}
172+
}
173+
}else if(node.left != null && node.right != null){
174+
//已经找到要删除的结点并且当前结点不为叶结点。
175+
//替换要删除结点的值。
176+
node.v = min(node.right).v;
177+
node.right = delete(node.right, node.v);
178+
}else{
179+
//已找到要删除的结点,只有一棵子树。
180+
node = (node.left != null) ? node.left:node.right;
181+
}
182+
if(node != null) node.height = Math.max(height(node.left), height(node.right)) + 1;
183+
return node;
184+
}
185+
127186
public static void main(String[] args) {
128187
BalancedBinaryTree<Integer> avlTree = new BalancedBinaryTree<>();
129188
avlTree.insert(5);
@@ -151,5 +210,9 @@ public static void main(String[] args) {
151210
System.out.println(avlTree.root.v);
152211
System.out.println(avlTree.height(avlTree.root));
153212
System.out.println("-------------------------------------");
213+
avlTree.delete(4);
214+
System.out.println(avlTree.root.v);
215+
System.out.println(avlTree.height(avlTree.root));
216+
System.out.println("-------------------------------------");
154217
}
155218
}

0 commit comments

Comments
 (0)