删除对象无子节点
删除对象无右节点
删除对象有右节点
package com.example.chyer.demo;
import java.util.Stack;
public class Test {
private String v;
private Test left;
private Test right;
private Test parent;
public static void main(String[] args) {
// 初始化二叉树
Test parent = new Test();
parent.v = "4";
parent.left = new Test();
parent.left.parent = parent;
parent.left.v = "2";
parent.left.left = new Test();
parent.left.left.parent = parent.left;
parent.left.left.v = "1";
parent.left.right = new Test();
parent.left.right.parent = parent.left;
parent.left.right.v = "3";
parent.right = new Test();
parent.right.parent = parent;
parent.right.v = "6";
parent.right.left = new Test();
parent.right.left.parent = parent.right;
parent.right.left.v = "5";
parent.delNode("2");
System.out.println("中序遍历:");
parent.infixOrder();
}
public String toString() {
return this.v + "-s";
}
// 二叉搜索树删除
public void delNode(String no) {
// 查找目标节点
Test delTar = this.preOrderSearch(no);
if (delTar == null) {
System.out.println("无相关节点。no:" + no);
return;
}
// 删除对象无子节点
if (delTar.left == null && delTar.right == null) {
delTar = null;
return;
} else if (delTar.right == null) {
// 删除对象无右节点
if (delTar.parent.left == delTar) {
delTar.parent.left = delTar.left;
} else if (delTar.parent.right == delTar) {
delTar.parent.right = delTar.left;
}
delTar.left.parent = delTar.parent;
delTar = null;
return;
} else {
// 删除对象有右节点
Test minTar = this.getLeft(delTar.right);
if (delTar.parent.left == delTar) {
delTar.parent.left = minTar;
} else if (delTar.parent.right == delTar) {
delTar.parent.right = minTar;
}
minTar.parent = delTar.parent;
// TODO 未完功能
delTar = null;
return;
}
}
public Test getLeft(Test root) {
Stack<Test> stack = new Stack<>();
Test node = root;
while (node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
if (node != null) {
return node;
} else {
return null;
}
}
// 二叉树查找
public Test preOrderSearch(String no) {
System.out.println("进入前序遍历");
//比较当前结点是不是
if (this.v == no) {
return this;
}
//1.则判断当前结点的左子节点是否为空,如果不为空,则递归前序查找
//2.如果左递归前序查找,找到结点,则返回
Test resNode = null;
if (this.left != null) {
resNode = this.left.preOrderSearch(no);
}
if (resNode != null) {
return resNode;
}
//1.左递归前序查找,找到结点,则返回,否继续判断,
//2.当前的结点的右子节点是否为空,如果不空,则继续向右递归前序查找
if (this.right != null) {
resNode = this.right.preOrderSearch(no);
}
if (resNode != null) {
return resNode;
}
System.out.println("未找到相同节点。");
return null;
}
//编写前序遍历的方法
public void preOrder() {
System.out.println(this); //先输出父结点
//递归向左子树前序遍历
if (this.left != null) {
this.left.preOrder();
}
//递归向右子树前序遍历
if (this.right != null) {
this.right.preOrder();
}
}
//中序遍历
public void infixOrder() {
//递归向左子树中序遍历
if (this.left != null) {
this.left.infixOrder();
}
//输出父结点
System.out.println(this);
//递归向右子树中序遍历
if (this.right != null) {
this.right.infixOrder();
}
}
}