1. 什么是二叉排序树
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
2.代码实现
package com
.qin
.binarysorttree
;
public class BinarySortTreeDemo {
public static void main(String
[] args
) {
int[] arr
= {7,3,10,12,5,1,9,2};
BinarySortTree binarySortTree
= new BinarySortTree();
for (int i
= 0; i
< arr
.length
; i
++) {
binarySortTree
.add(new Node(arr
[i
]));
}
System
.out
.println("删除前中序遍历");
binarySortTree
.infixOrder();
System
.out
.println("=====================");
binarySortTree
.delNode(7);
System
.out
.println("删除后中序遍历");
binarySortTree
.infixOrder();
}
}
class BinarySortTree{
private Node root
;
public void add(Node node
){
if (root
==null
){
root
= node
;
}else {
root
.add(node
);
}
}
public void infixOrder(){
if (root
!=null
){
root
.infixOrder();
}else {
System
.out
.println("当前二叉排序树是空的,无法遍历");
}
}
public Node
search(int value
){
if (root
== null
){
return null
;
}else {
return root
.search(value
);
}
}
public Node
searchParent(int value
){
if (root
== null
){
return null
;
}else {
return root
.searchParent(value
);
}
}
public void delNode(int value
){
if (root
== null
){
return;
}else {
Node targetNode
= search(value
);
if (targetNode
==null
){
return;
}
if (root
.left
==null
&&root
.right
==null
){
root
= null
;
return;
}
Node parent
= searchParent(value
);
if (targetNode
.left
==null
&& targetNode
.right
==null
){
if (parent
.left
!=null
&& parent
.left
.value
==value
){
parent
.left
= null
;
}else if (parent
.right
!=null
&& parent
.right
.value
==value
){
parent
.right
= null
;
}
}else if(targetNode
.left
!=null
&& targetNode
.right
!=null
){
int minVal
= delRightTreeMin(targetNode
.right
);
targetNode
.value
= minVal
;
}else {
if (targetNode
.left
!=null
){
if (parent
!=null
){
if (parent
.left
.value
==targetNode
.value
){
parent
.left
= targetNode
.left
;
}else {
parent
.right
= targetNode
.left
;
}
}else {
root
= targetNode
.left
;
}
}else {
if (parent
!=null
){
if (parent
.left
.value
==targetNode
.value
){
parent
.left
= targetNode
.right
;
}else {
parent
.right
= targetNode
.right
;
}
}else {
root
= targetNode
.right
;
}
}
}
}
}
public int delRightTreeMin(Node node
){
Node temp
= node
;
while (temp
.left
!=null
){
temp
= temp
.left
;
}
delNode(temp
.value
);
return temp
.value
;
}
}
class Node{
int value
;
Node left
;
Node right
;
public Node(int value
) {
this.value
= value
;
}
@Override
public String
toString() {
return "Node{" +
"value=" + value
+
'}';
}
public void add(Node node
){
if (node
== null
){
return;
}
if (node
.value
<this.value
){
if (this.left
==null
){
this.left
= node
;
}else {
this.left
.add(node
);
}
}else {
if (this.right
==null
){
this.right
= node
;
}else {
this.right
.add(node
);
}
}
}
public void infixOrder(){
if (this.left
!=null
){
this.left
.infixOrder();
}
System
.out
.println(this);
if (this.right
!=null
){
this.right
.infixOrder();
}
}
public Node
search(int value
){
if (value
==this.value
){
return this;
}else if (value
< this.value
){
if (this.left
==null
){
return null
;
}
return this.left
.search(value
);
}else {
if (this.right
==null
){
return null
;
}
return this.right
.search(value
);
}
}
public Node
searchParent(int value
){
if((this.left
!= null
&& this.left
.value
== value
)||
(this.right
!= null
&& this.right
.value
== value
)){
return this;
}else {
if (this.value
>value
&& this.left
!=null
){
return this.left
.searchParent(value
);
}else if (this.value
<=value
&& this.right
!=null
){
return this.right
.searchParent(value
);
}else {
return null
;
}
}
}
}
结果