2025-01-23 排序二叉树删除
This commit is contained in:
parent
c8efffad57
commit
1df69553df
@ -65,6 +65,108 @@ public class BinaryTreeIterator {
|
||||
return deleteFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 二叉排序树的删除(还有待改进,如果删除的节点是根节点的情况还需优化)
|
||||
* @param tempNode
|
||||
* @param node
|
||||
* @return
|
||||
*/
|
||||
private boolean deleteNoteAdvance(TreeNode tempNode, int node){
|
||||
boolean deleteFlag = false;
|
||||
if (tempNode == null){
|
||||
return false;
|
||||
}
|
||||
// 需要判断当前节点的左子节点是否为空,因为二叉树是单向的,所以不能直接判断当前节点
|
||||
if(tempNode.left != null){
|
||||
if(tempNode.left.node == node){
|
||||
// 第一种情况:删除的节点没有子节点
|
||||
if(tempNode.left.left == null && tempNode.left.right == null){
|
||||
tempNode.left = null;
|
||||
return true;
|
||||
}
|
||||
// 第二种情况:删除的节点有一个子节点
|
||||
// 2.1 删除的节点有一个左子节点
|
||||
if(tempNode.left.left != null && tempNode.left.right == null){
|
||||
tempNode.left = tempNode.left.left;
|
||||
return true;
|
||||
}
|
||||
// 2.2 删除的节点有一个右子节点
|
||||
if(tempNode.left.left == null && tempNode.left.right != null){
|
||||
tempNode.left = tempNode.left.right;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 第三种情况:删除的节点有两个子节点
|
||||
if(tempNode.left.left != null && tempNode.left.right != null){
|
||||
TreeNode delNode = tempNode.left.right;
|
||||
int del = 0;
|
||||
while(true){
|
||||
if(delNode == null){
|
||||
break;
|
||||
}
|
||||
if (delNode.node > del){
|
||||
del = delNode.node;
|
||||
}
|
||||
delNode = delNode.right;
|
||||
}
|
||||
deleteNoteAdvance(tempNode.left, del);
|
||||
tempNode.left.node = del;
|
||||
return true;
|
||||
}
|
||||
|
||||
} else {
|
||||
if(deleteNoteAdvance(tempNode.left, node)){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 需要判断当前节点的右子节点是否为空,因为二叉树是单向的,所以不能直接判断当前节点
|
||||
if(tempNode.right != null){
|
||||
if(tempNode.right.node == node){
|
||||
// 第一种情况:删除的节点没有子节点
|
||||
if(tempNode.right.left == null && tempNode.right.right == null){
|
||||
tempNode.right = null;
|
||||
return true;
|
||||
}
|
||||
// 第二种情况:删除的节点有一个子节点
|
||||
// 2.1 删除的节点有一个左子节点
|
||||
if(tempNode.right.left != null && tempNode.right.right == null){
|
||||
tempNode.right = tempNode.right.left;
|
||||
return true;
|
||||
}
|
||||
// 2.2 删除的节点有一个右子节点
|
||||
if(tempNode.right.left == null && tempNode.right.right != null){
|
||||
tempNode.right = tempNode.right.right;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 第三种情况:删除的节点有两个子节点
|
||||
if(tempNode.right.left != null && tempNode.right.right != null){
|
||||
TreeNode delNode = tempNode.right.left;
|
||||
int del = 0;
|
||||
while(true){
|
||||
if(delNode == null){
|
||||
break;
|
||||
}
|
||||
if (delNode.node > del){
|
||||
del = delNode.node;
|
||||
}
|
||||
delNode = delNode.right;
|
||||
}
|
||||
deleteNoteAdvance(tempNode.left, del);
|
||||
tempNode.right.node = del;
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if(deleteNoteAdvance(tempNode.right, node)){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return deleteFlag;
|
||||
}
|
||||
|
||||
private void forwardIterator(TreeNode treeNode){
|
||||
if(treeNode == null){
|
||||
System.out.println("当前节点为空");
|
||||
@ -138,7 +240,7 @@ public class BinaryTreeIterator {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] arr = {7, 3, 10, 12, 5, 1, 9};
|
||||
int[] arr = {7, 3, 10, 12, 5, 1, 9, 2, 11};
|
||||
BinaryTreeIterator treeIterator = new BinaryTreeIterator();
|
||||
treeIterator.transTree(arr);
|
||||
/**
|
||||
@ -146,7 +248,7 @@ public class BinaryTreeIterator {
|
||||
3 10
|
||||
1 5 9 12
|
||||
**/
|
||||
boolean delFlag = treeIterator.deleteNode(treeIterator.root, 9);
|
||||
boolean delFlag = treeIterator.deleteNoteAdvance(treeIterator.root, 3);
|
||||
System.out.println("删除结果:"+delFlag);
|
||||
System.out.println("前序遍历:");
|
||||
treeIterator.forwardIterator(treeIterator.root);
|
||||
|
Loading…
Reference in New Issue
Block a user