2025-01-23 排序二叉树删除

This commit is contained in:
liangjinglin 2025-01-23 15:10:44 +08:00
parent c8efffad57
commit 1df69553df

View File

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