二叉查找树(Binary Search Tree)(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
public class MyTree {
private TreeNode root = null;
class TreeNode{
int data;
public TreeNode(){}
public TreeNode(int data){
this.data = data;
}
TreeNode left = null;
TreeNode right = null;
}
//向树中添加值添加值
public void add(int data){
if(root == null){
root = new TreeNode(data);
}else{
addFunc(data,root);
}
System.out.println("添加成功!");
}
private void addFunc(int data,TreeNode r){
if(r.data > data){
if(r.left == null){
r.left = new TreeNode(data);
return;
}
addFunc(data,r.left);
} else{
if(r.right == null){
r.right = new TreeNode(data);
return;
}
addFunc(data,r.right);
}
}
//删除树中的值
public void delete(int data){
if(root != null && data == root.data){
root = func(root);
System.out.println("删除成功!");
return;
}
deleFunc(root,data);
}
private void deleFunc(TreeNode node,int data){
if(node == null){
return;
}
if(node.right == null && node.left == null && node.data != data){
System.out.println("未查找到该值!");
return;
}
if(node.left != null && node.left.data == data){
Func(node,node.left,false);
System.out.println("删除成功!");
return;
}else if(node.right != null && node.right.data == data){
Func(node,node.right,true);
System.out.println("删除成功!");
return;
}
if(node.data < data){
deleFunc(node.right,data);
}else{
deleFunc(node.left,data);
}
}
private void Func(TreeNode parent,TreeNode node,boolean isRightChild){
if(node.left == null && node.right == null){ //产出结点没有子节点
if(!isRightChild){
parent.left = null;
}else{
parent.right = null;
}
return;
}else if(node.right == null && node.left != null){ //当删除结点有只有右节点
if(isRightChild){
parent.right = node.left;
}else{
parent.left = node.left;
}
}else if(node.left == null && node.right != null){//当删除结点有只有左节点
if(isRightChild){
parent.right = node.right;
}else{
parent.left = node.right;
}
}else if(node.left != null && node.right != null){
if(isRightChild){
parent.right = func(node);
}else{
parent.left = func(node);
}
}
}
//当删除结点有两个子节点
private TreeNode func(TreeNode node){
if(node.right.left == null){
node.right.left = node.left;
}else{
TreeNode temp = node.left;
TreeNode curr = node.right;
while(curr != null){
if(curr.data < temp.data && curr.right == null){
curr.right = temp;
break;
}
else if(curr.data > temp.data && curr.left == null){
curr.left = temp;
break;
}
if(curr.data > temp.data)
curr = curr.left;
else if(curr.data < temp.data)
curr = curr.right;
}
}
return node.right;
}
public void show(){
showFunc(root);
System.out.println();
}
private void showFunc(TreeNode node){
if(node == null) return;
//中序遍历
showFunc(node.left);
System.out.print(node.data + " ");
showFunc(node.right);
// 前序遍历
// System.out.print(node.data + " ");
// showFunc(node.left);
// showFunc(node.right);
// 后序遍历
// showFunc(node.left);
// showFunc(node.right);
// System.out.print(node.data + " ");
}
public static void main(String[] args) {
MyTree test = new MyTree();
test.add(10);
test.add(9);
test.add(15);
test.add(12);
test.add(19);
test.add(17);
test.add(25);
test.add(11);
test.add(13);
test.add(0);
test.show();
test.delete(10);
test.show();
}
}
实现结果