数据结构--二叉排序树

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值