BinTreeNode.java
public class BinTreeNode {
//节点数据
int data;
//左节点
BinTreeNode LeftChild;
//右节点
BinTreeNode RightChild;
//无参构造函数
public BinTreeNode(int data){
this.data = data;
}
}
BinaryTree.java
public class BinaryTree {
//根结点
private BinTreeNode root;
//判断有无左子女
private boolean isLeftChild;
//插入节点
public void insert(int data){
//给data创建树结点
BinTreeNode temp = new BinTreeNode(data);
//判断根结点是否为空
if(root == null){
//设置为根结点
root = temp;
System.out.println("插入成功");
return;
}
else{
//暂存结点
BinTreeNode current = root;
//父结点
BinTreeNode parent = null;
//若当前结点不为空
while(current != null){
parent = current;
//判断结点存放数据是否大于输入数据
if(current.data > data) {
//设置为左子女
current = current.LeftChild;
//判断暂存结点是否为空
if (current == null) {
//暂存结点设置为父结点的左结点
parent.LeftChild = temp;
System.out.println("插入成功");
return;
}
}else{
//暂存结点设置为右结点
current = current.RightChild;
if(current == null){
//暂存结点设置为父结点的右结点
parent.RightChild = temp;
System.out.println("插入成功");
return;
}
}
}
}
System.out.println("插入失败");
return;
}
//删除某一数据
public void delete(int data){
BinTreeNode current = root;
BinTreeNode parent = root;
//寻找结点
while(current.data != data){
parent = current;
if(current.data > data) {
isLeftChild = true;
current = current.LeftChild;
}
else {
isLeftChild = false;
current = current.RightChild;
}
if(current == null) {
System.out.println("未找到");
return;
}
}
//第一种情况:没有左右子女
if(current.LeftChild == null && current.RightChild == null){
//当前结点是根结点
if(current == root){
root = null;
}
else if(isLeftChild){
parent.LeftChild = null;
}
else {
parent.RightChild = null;
}
System.out.println("删除成功");
return;
}
//第一种情况:有左子女,没右子女
else if(current.LeftChild != null && current.RightChild == null){
//当前结点是根结点
if(current == root){
root = current.LeftChild;
}
else if(isLeftChild){
parent.LeftChild = current.LeftChild;
}
else {
parent.RightChild = current.LeftChild;
}
System.out.println("删除成功");
return;
}
//第二种情况:没有左子女,有右子女
else if(current.LeftChild == null && current.RightChild != null){
//当前结点是根结点
if(current == root){
root = current.RightChild;
}
else if(isLeftChild){
parent.LeftChild = current.RightChild;
}
else {
parent.RightChild = current.RightChild;
}
System.out.println("删除成功");
return;
}
//第三种情况:有左右子女(比较难,建议画个图理解下)
else{
BinTreeNode newParent = current;
BinTreeNode newCurrent = current;
BinTreeNode temp = current.RightChild;
//寻找被删结点的后继子女
while(temp != null){
newParent = newCurrent;
newCurrent = temp;
temp = temp.LeftChild;
}
//这部分最为关键
if(newCurrent != current.RightChild){
newParent.LeftChild = newCurrent.RightChild;
newCurrent.RightChild = current.RightChild;
}
if(current == root){
root =newCurrent;
}
else if(isLeftChild){
parent.LeftChild = newCurrent;
}
else{
parent.RightChild = newCurrent;
}
newCurrent.LeftChild = current.LeftChild;
System.out.println("删除成功");
return;
}
}
//中序遍历:左子树->根结点->右子树
public void LDR(BinTreeNode current){
if(current != null){
LDR(current.LeftChild);
System.out.print(current.data+" ");
LDR(current.RightChild);
}
}
//前序遍历:根结点->左子树->右子树
public void DLR(BinTreeNode current){
if(current != null){
System.out.print(current.data+" ");
DLR(current.LeftChild);
DLR(current.RightChild);
}
}
//后序遍历:左子树->右子树->根结点
public void LRD(BinTreeNode current){
if(current != null){
LRD(current.LeftChild);
LRD(current.RightChild);
System.out.print(current.data+" ");
}
}
//寻找数据位置
public BinTreeNode search(int data){
BinTreeNode current = root;
//寻找结点
while(current.data != data){
if(current.data > data) {
isLeftChild = true;
current = current.LeftChild;
}
else {
isLeftChild = false;
current = current.RightChild;
}
if(current == null) {
System.out.println("未找到");
return null;
}
}
return current;
}
}
main.java
public class main {
public static void main(String[] args) {
BinaryTree tree =new BinaryTree();
tree.insert(15);
tree.insert(10);
tree.insert(20);
tree.insert(5);
tree.insert(13);
tree.insert(17);
tree.insert(22);
tree.insert(2);
tree.insert(8);
tree.insert(12);
tree.insert(14);
tree.insert(16);
tree.insert(18);
tree.insert(21);
tree.insert(25);
tree.insert(1);
tree.delete(20);
tree.LDR(tree.search(15));
System.out.println();
tree.DLR(tree.search(15));
System.out.println();
tree.LRD(tree.search(15));
System.out.println();
}
}