self_example/Leecode/src/main/java/tree/DeleteNode.java

102 lines
2.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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