package tree; import lombok.Data; import lombok.ToString; import java.util.List; import static tree.InorderTraversal.inorderTraversal1; /** * 删除二叉排序树的某个节点 */ public class DeleteNode { public static void main(String[] args) { TreeNode root = new TreeNode(4); TreeNode TreeNode2 = new TreeNode(2); TreeNode TreeNode3 = new TreeNode(6); TreeNode TreeNode4 = new TreeNode(1); TreeNode TreeNode5 = new TreeNode(3); TreeNode TreeNode6 = new TreeNode(5); root.setLeft(TreeNode2); root.setRight(TreeNode3); TreeNode2.setLeft(TreeNode4); TreeNode2.setRight(TreeNode5); TreeNode3.setLeft(TreeNode6); deleteNode(root, 5); List integers = inorderTraversal1(root); System.out.println(integers); } public static void deleteNode(TreeNode root, int value) { //删除的是有左右两个子树的节点 TreeNode p = root; //记录当前节点的父节点 TreeNode pp = null; //寻找到要删除的节点和他的父节点 while (p != null && p.val != value) { pp = p; if (p.val < value) { p = p.right; } else if (p.val > value) { p = p.left; } } //判断是根据那个条件出来的 if (p == null) { System.out.println("未找到要删除的节点的值..."); return; } else if (p.val == value) { //p是要删除的节点,pp是他的父节点,如果pp=null,删除的就是root //判断删除的节点有几个子树 if (p.left != null && p.right != null) { //左右子树都有,将找到右子树最小的节点,将他的值付给p,然后变成删除这个最小的数 TreeNode min = p.right; //记录他的父节点 TreeNode flag = p; while (min.left != null) { flag = min; min = min.left; } p.val = min.val; p = min; pp = flag; } //现在要删除的节点最多只有一个子树 TreeNode child = null; if (p.left != null) { child = p.left; } else if (p.right != null) { child = p.right; } if (pp == null) { //要删除的是根节点 root = child; } else if (pp.left == p) pp.left = child; else pp.right = child; } } }