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