package com.test;
import java.util.Scanner;
public class TestBintree {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
TreeNode head = new TreeNode(x, 1, null); //输入一个整数 ,构造第一个结点
while (scan.hasNext()) {
int n = scan.nextInt();
if (n == -1) {
System.out.println("二叉排序树创建完成");
break;
} else {
create(head, n);
}
}
preOrder(head);
delete(head, 10);
System.out.println();
preOrder(head);
}
public static void create(TreeNode head, int n) { // 创建二叉查找树(二叉排序树)
int id = head.getId();
if(n == id) {
System.out.println("创建的值已经存在");
return;
}
if (n < id) {
if (head.getLchild() == null) {
head.setLchild(new TreeNode(n, 2 * head.getNum(), head));
return;
} else {
create(head.getLchild(), n);
}
} else {
if (head.getRchild() == null) {
head.setRchild(new TreeNode(n, 2 * head.getNum() + 1, head));
return;
} else {
create(head.getRchild(), n);
}
}
}
public static void preOrder(TreeNode head) { // 中序遍历二叉树
if (head == null) {
return;
} else {
preOrder(head.getLchild());
System.out.print(head.getId() + ":" + head.getNum() + " ");
preOrder(head.getRchild());
}
}
public static void delete(TreeNode head, int id) { // 删除某个节点
while (true) { //查找要删除的结点所在的位置
if (id == head.getId()) {
break;
}
if (id < head.getId()) {
head = head.getLchild();
if (head == null) {
System.out.println("所要删除的结点不存在");
return;
}
} else {
head = head.getRchild();
if (head == null) {
System.out.println("所要删除的结点不存在");
return;
}
}
}
TreeNode lchild = head.getLchild();
TreeNode rchild = head.getRchild();
TreeNode father = head.getFather();
int num = head.getNum();
if (num % 2 == 0) { //要删除的结点是左孩子
if (lchild == null && rchild == null) { //要删除的结点是叶子结点
father.setLchild(null);
head = null;
} else {
if (lchild != null && rchild == null) { //要删除的结点是只有左孩子
lchild.setNum(num);
father.setLchild(lchild);
head = null;
} else {
if (lchild == null && rchild != null) { //要删除的结点只有右孩子
rchild.setNum(num);
father.setLchild(rchild);
head = null;
} else {
head.setId(lchild.getId()); //要删除的结点既有左孩子,也有右孩子
head.setLchild(lchild.getLchild());
if (lchild.getRchild() != null) {
if (rchild.getLchild() != null) {
while (rchild.getLchild() != null) {
rchild = rchild.getLchild();
}
}
lchild.getRchild().setNum(num + 1);
rchild.setLchild(lchild.getRchild());
}
lchild.setRchild(null);
lchild.setLchild(null);
lchild = null;
}
}
}
} else { //要删除的结点是右孩子
if (lchild == null && rchild == null) { //要删除的结点是叶子结点
father.setRchild(null);
head = null;
} else {
if (lchild != null && rchild == null) { //要删除的结点是只有左孩子
lchild.setNum(num);
father.setRchild(lchild);
head = null;
} else {
if (lchild == null && rchild != null) { //要删除的结点只有右孩子
rchild.setNum(num);
father.setRchild(rchild);
head = null;
} else { //要删除的结点既有左孩子,也有右孩子
head.setId(rchild.getId());
head.setRchild(rchild.getRchild());
if (rchild.getLchild() != null) {
if (lchild.getRchild() != null) {
while (lchild.getRchild() != null) {
lchild = lchild.getRchild();
}
}
rchild.getLchild().setNum(num - 1);
lchild.setRchild(rchild.getLchild());
}
rchild.setRchild(null);
rchild.setLchild(null);
rchild = null;
}
}
}
}
}
public static boolean find(TreeNode head, int id) { //查找某个结点,存在返回true,否则返回false
while (true) {
if (id == head.getId()) {
return true;
}
if (id < head.getId()) {
head = head.getLchild();
if (head == null) {
return false;
}
} else {
head = head.getRchild();
if (head == null) {
return false;
}
}
}
}
}
class TreeNode { //结点的结构
private int id;
private int num;
private TreeNode lchild;
private TreeNode rchild;
private TreeNode father;
public TreeNode(int id, int num, TreeNode father) {
this.id = id;
this.num = num;
this.father = father;
}
public TreeNode getFather() {
return father;
}
public void setFather(TreeNode father) {
this.father = father;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public TreeNode getLchild() {
return lchild;
}
public void setLchild(TreeNode lchild) {
this.lchild = lchild;
}
public TreeNode getRchild() {
return rchild;
}
public void setRchild(TreeNode rchild) {
this.rchild = rchild;
}
}