102 lines
2.6 KiB
Java
102 lines
2.6 KiB
Java
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<Integer> 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;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
}
|