From 1df69553dff8e6796902588cafa5830f0802fa91 Mon Sep 17 00:00:00 2001 From: liangjinglin Date: Thu, 23 Jan 2025 15:10:44 +0800 Subject: [PATCH] =?UTF-8?q?2025-01-23=20=E6=8E=92=E5=BA=8F=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/tree/BinaryTreeIterator.java | 106 +++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/src/dataANDcalc/java/tree/BinaryTreeIterator.java b/src/dataANDcalc/java/tree/BinaryTreeIterator.java index 73992ff..92b80b4 100644 --- a/src/dataANDcalc/java/tree/BinaryTreeIterator.java +++ b/src/dataANDcalc/java/tree/BinaryTreeIterator.java @@ -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);