数据结构--二叉排序树

来源:互联网 发布:新纳粹知乎 编辑:程序博客网 时间:2024/06/05 19:03

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

原创粉丝点击