<span style="font-size:18px;">package 二叉树;
public class BST {
private Node root;
//添加
private boolean addNode(int value,Node T){
if(null == T){
T = new Node(value);
return true;
}
Node temp = T;
if(value < temp.getValue()){
if(null == temp.getLeft()){
temp.setLeft(new Node(value));
}else{
addNode(value,temp.getLeft());
}
}else if(value > temp.getValue()){
if(null == temp.getRight()){
temp.setRight(new Node(value));
}else{
addNode(value,temp.getRight());
}
}else{
System.out.println("有相同值!");
}
return false;
}
private boolean find(int value,Node T){
if(value == T.getValue()){
return true;
}else if(value > T.getValue()){
if(null == T.getRight()){
return false;
}else{
return find(value,T.getRight());
}
}else{
if(null == T.getLeft()){
return false;
}else{
return find(value,T.getLeft());
}
}
}
//删除
private static boolean DeleteBST(Node T,Node parent,int key){
if(null == T){
return false;
}else{
if(key == T.getValue()){
return Delete(T,parent);
}else if(key < T.getValue()){
return DeleteBST(T.getLeft(),T, key);
}else{
return DeleteBST(T.getRight(),T, key);
}
}
}
private static boolean Delete(Node T, Node parent) {
Node q,s;
if(null == T.getLeft()){
if(parent.getLeft() == T){
parent.setLeft(T.getRight());
}else if(parent.getRight() == T){
parent.setRight(T.getRight());
}
}else if(null == T.getRight()){
if(parent.getLeft() == T){
parent.setLeft(T.getLeft());
}else if(parent.getRight() == T){
parent.setRight(T.getLeft());
}
}else{
q = T;
s = T.getLeft();
while(s.getRight() != null){//转左,到右的尽头(待删节点的前驱)
q = s;
s = s.getRight();
}
T.setValue(s.getValue()); //s指向被删节点的前驱,将节点值赋给p节点
if(q != T){//若经过了while循环,q滑到了s的父节点上,而s此时为待删节点的前驱,那么q与p便不相等
q.setRight(s.getLeft());//s经过循环后,已经是没有右子节点了 所以取它的左子节点作为q的右子节点,从而等于是删掉了s
}else{
q.setLeft(s.getLeft());
}
}
return false;
}
//前序遍历
private void preList(Node T){
System.out.print(T.getValue() + " ");
if(null != T.getLeft()){
preList(T.getLeft());
}
if(null != T.getRight()){
preList(T.getRight());
}
}
public static void main(String[] args) {
int[] arr = new int[]{29,35,36,37,47,48,49,50,51,56,58,62,73,88,93,99};
BST r = new BST();
r.root = new Node(62);
for(int i=0 ; i<arr.length ; i++){
r.addNode(arr[i],r.root);
}
r.preList(r.root);
System.out.println();
r.DeleteBST(r.root, null, 47);
r.preList(r.root);
}
}
</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">结果:</span>
<span style="font-size:18px;">有相同值!
62 29 35 36 37 47 48 49 50 51 56 58 73 88 93 99
62 29 35 36 37 48 49 50 51 56 58 73 88 93 99
</span>