1、基本概念
二叉排序树又称二叉查找树,它是一颗空树或者具有以下特征的二叉树:
若左子树不为空,则左子树上所有节点的值都小于根结构的值
若右子树不为空,则右子树上所有节点的值都大于根结构的值
它的左右子树也分别是二叉排序树
2、具体操作
static class Node{
int data;
Node left, right;
public Node(int data){
this.data = data;
left = null;
right = null;
}
}
public static void main(String[] args) {
int[] src = { 5,7,3,1,9,6,4 };
Node root = null;
for (int i = 0; i <src.length; i++) {
root = insert(src[i], root);
}
remove(3,root);
print(root);
}
//中序遍历
public static void print(Node node){
if(node != null) {
print(node.left);
System.out.println(node.data + " ");
print(node.right);
}
}
//判断是否存在值
public static boolean contain(Node node, int data){
if (node == null)
return false;
if(data > node.data)
contain(node.right, data);
else if (data < node.data)
contain(node.left, data);
else
return true;
return false;
}
//插入操作
public static Node insert(int data, Node node){
if(node == null)
return new Node(data);
if(data < node.data)
node.left = insert(data, node.left);
else if(data > node.data)
node.right = insert(data, node.right);
else
return node;
return node;
}
//查找树中的最小值
public static Node findMin(Node node){
if(node == null)
return null;
else if(node.left == null)
return node;
else
return findMin(node.left);//最左边的是最小的
}
//查找树中的最大值
public static Node findMax(Node node){
if(node == null)
return null;
else if(node.right == null)
return node;
else
return findMax(node.right);//最右边的是最大的
}
//删除操作
//1 删除没有左子树或者右子树的节点,直接删除当前节点
//2 如果待删除的节点有左右子树,则查找当前节点的右子树中最小值节点并将值赋给当前节点,再删除右子树的最小值的节点
private static Node remove(int data,Node node) {
if(node == null)
return null;
if(data < node.data)
node.left = remove(data, node.left);
else if(data > node.data)
node.right = remove(data, node.right);
else if(node.left!=null && node.right!=null) {//找到需要删除的节点且节点下有两个子节点
//先找到需要删除的节点下,右子树中最小的节点
//并将它的值赋给需要删除的节点。
node.data = findMin(node.right).data;
//删除前面找到的最小的节点。将从当前节点再次递归查找并删除
node.right = remove(node.data, node.right);
} else
node = (node.left != null) ? node.left : node.right;
return node;
}
参考:
大话数据结构
数据结构与算法分析-java版
http://blog.csdn.net/sb1ue/article/details/8922326