栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现二叉排序树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现二叉排序树

public class SearchBST {

    //二叉树类
    private static class BinaryTree{
        int data;
        BinaryTree lchild;
        BinaryTree rchild;
    }
    static BinaryTree newTree = new BinaryTree(); //树的根结点

    //全局变量:存放查找到的关键字所在的父结点
    static BinaryTree parentNode = new BinaryTree();
    
    public static boolean searchBST(BinaryTree bt,int key,BinaryTree parent){
        if (null == bt || 0 == bt.data){ //树结点不存在,返回
            parentNode = parent;
            return false;
        }else if (key == bt.data){ //查找成功
            parentNode = bt;
            return true;
        }else if (key < bt.data){ //关键字小于根结点则查找左子树
            return searchBST(bt.lchild,key,bt);
        }else{ //关键字大于根结点则查找右子树
            return searchBST(bt.rchild,key,bt);
        }
    }
    
    public static boolean insertBST(BinaryTree bt,int key){
        BinaryTree s;
        if (!searchBST(bt,key,null)){
            s = new BinaryTree();
            s.data = key;
            s.lchild = s.rchild = null;
            if (null == parentNode){ //不存在,则表明时父结点,将s指向bt成为新的根结点
                bt = s;
            }else if (key < parentNode.data){//当key小于根结点,则插入为左孩子
                parentNode.lchild = s;
            }else{ //当key大于根结点,则插入为右孩子
                parentNode.rchild = s;
            }
            preOrderTraverse(bt); //中序遍历二叉树
        }else{
            System.out.println("该结点已经存在!");
        }
        return false;
    }

    
    static void preOrderTraverse(BinaryTree t){
        if (null == t || 0 == t.data){
            return;
        }
        if (null != t.lchild){
            preOrderTraverse(t.lchild); //中序遍历左子树
        }
        if (0 != t.data){
            System.out.println("[" + t.data + "]");//显示当前结点数据
        }
        if (null != t.rchild){
            preOrderTraverse(t.rchild);//中序遍历右子树
        }
    }
    
    public static boolean generateBST(int key){
        if (!searchBST(newTree,key,null)){
            BinaryTree s = new BinaryTree();
            s.data = key;
            s.lchild = s.rchild = null;
            if (null == parentNode){ //不存在,则表明是父结点,将s指向bt成为新的根结点
                newTree = s;
            }else if (key < parentNode.data){//当key小于根结点,则插入为左孩子
                parentNode.lchild = s;
            }else{ //当key大于根结点,则插入为右孩子
                parentNode.rchild = s;
            }
            preOrderTraverse(newTree);
            return true;
        }else{
            System.out.println("该结点已经存在!");
        }
        return false;
    }

    
    public static boolean delete(BinaryTree bt){
        BinaryTree q,s;
        if (null == bt.rchild){ //右子树为空则只需要接左子树
            bt = bt.lchild;
        }else if (null == bt.lchild){ //左子树为空则只需要接右子树
            bt = bt.rchild;
        }else{
            q = bt;
            s = bt.lchild;
            while (null != s.rchild){ //转左,然后向右到尽头(找到待删除结点的前驱)
                q = s;
                s = s.rchild;
            }
            bt.data = s.data; //s指向被删除结点的直接前驱
            if ( q != bt){
                q.rchild = s.lchild; //重接q的右子树
            }else{ //q.data == bt.data,则说明s.rchild == null
                q.lchild = s.lchild; //重接q的左子树
            }
        }
        return true;
    }

    
    public static boolean deleteBST(BinaryTree bt,int key){
        if (!searchBST(bt,key,null)){ //不存在关键字等于key的元素
            return false;
        }else{
            if (bt.data == key){
                return delete(bt);
            }else if (key < bt.data){
                return deleteBST(bt.lchild,key);
            }else{
                return deleteBST(bt.rchild,key);
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {62,88,58,47,35,73,51,99,37,93};

        long start = System.currentTimeMillis(); //算法的开始时间
        for (int i = 0; i < a.length; i++) {
            generateBST(a[i]);
            System.out.println();
        }
        System.out.println(searchBST(newTree,99,null));
        long end = System.currentTimeMillis(); //算法的结束时间
        System.out.println("耗时:"+(end-start)+"ms");
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/973307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号