文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java如何实现二分搜索树

2023-06-29 13:19

关注

这篇文章将为大家详细讲解有关Java如何实现二分搜索树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.概念

a.是个二叉树(每个节点最多有两个子节点)

b.对于这棵树中的节点的节点值

左子树中的所有节点值 < 根节点 < 右子树的所有节点值

二分搜索树中一般不考虑值相等的情况(元素不重复)JDK中的搜索树就不存在相同的值(TreeMap-key)

Java如何实现二分搜索树

最大特点:也是判断是否是搜索树的方法

对该树进行中序遍历,就可以得到一个升序集合0 1 2 3 4 5 6 7 8 9

在一个有序区间上进行二分查找的时间复杂度? logn不断将集合/2/2 / 2 ==1为止logN

logN =》联想到"树"

2.重点操作

Java如何实现二分搜索树

当删除58时,此节点左右子树都不为空

Hibbard Deletion 1962

在BST中删除一个左右子树都存在的节点

找到当前以58为根节点的前驱或者后继节点作为删除后的新节点

前驱:在以58为根的BST中最后一个小于58的节点->53

后继:在以58为根的BST中第一个大于58的节点->59

当我们使用后继节点时,先连removeMin(root.right),在连root.left

TreeNode successor = findMin(root.right);successor.right = removeMin(root.right);successor.left = root.left;

3.完整代码

import java.util.NoSuchElementException; public class BST {     private class TreeNode{        private int val;        private TreeNode left;        private TreeNode right;         public TreeNode(int val) {            this.val = val;        }    }     private int size;    private TreeNode root;         public void add(int val){        root = add(root,val);    }     private TreeNode add(TreeNode root, int val) {        if(root == null){            //创建一个新节点            TreeNode newNode = new TreeNode(val);            size++;            return newNode;        }        //左子树插入        if(val < root.val){            root.left = add(root.left,val);        }        //右子树插入        if(val > root.val){            root.right = add(root.right,val);        }        return root;    }         public boolean contains(int val){        return contains(root,val);    }     private boolean contains(TreeNode root, int val) {        if(root == null){            return false;        }        if(val == root.val){            //找到了            return true;        }else if(val < root.val){            //递归左子树查找            return contains(root.left,val);        }else{            //递归右子树查找            return contains(root.right,val);        }    }         public int findMin(){        //判空        if(root == null){            //抛出一个空指针异常            throw new NoSuchElementException("root is empty! cannot find min");        }        TreeNode minNode = findMin(root);        return minNode.val;    }     private TreeNode findMin(TreeNode root) {        //当此节点左子树为空,说明此节点是最小值        if(root.left == null){            return root;        }        //递归访问左子树        return findMin(root.left);    }         public int findMax(){        //判空        if(root == null){            throw new NoSuchElementException("root is empty! cannot find max");        }        TreeNode maxNode = findMax(root);        return maxNode.val;    }     private TreeNode findMax(TreeNode root) {        //当此节点右子树为空,说明此节点是最大值        if(root.right == null){            return root;        }        //递归访问右子树        return findMax(root.right);    }         public int removeMin(){        int min =findMin();        root = removeMin(root);        return min;    }     private TreeNode removeMin(TreeNode root) {        if(root.left == null){            TreeNode right = root.right;            //找到最小值,删除节点            root = root.left = null;            size--;            return right;        }        root.left = removeMin(root.left);        return root;    }         public int removeMax(){        int max = findMax();        root = removeMax(root);        return max;    }     //在当前以root为根的BST中删除最小值所在的节点,返回删除后的树根    private TreeNode removeMax(TreeNode root) {        if(root.right == null){            TreeNode right = root.right;            //找到最大值,删除节点            root = root.right = null;            size--;            return right;        }        root.right = findMax(root.right);        return root;    }         public void removeValue(int value){        root = removeValue(root,value);    }     private TreeNode removeValue(TreeNode root, int value) {        if(root == null){            throw new NoSuchElementException("root is empty! cannot find remove");        }else if(value < root.val){            root.left = removeValue(root.left,value);            return root;        }else if(value > root.val){            root.right = removeValue(root.right,value);            return root;        }else {            //此时value == root.value            if(root.left == null){                //删除最小数                TreeNode right = root.right;                root = root.right = null;                size--;                return right;            }            if(root.right == null){                //删除最大数                TreeNode left = root.left;                root = root.left =null;                size--;                return left;            }            //找到当前该删除节点的前驱或者后继节点作为删除后的新节点            //当我们使用后继节点时,先连removeMin(root.right),在连root.left            TreeNode successor = findMin(root.right);            successor.right = removeMin(root.right);            successor.left = root.left;            return successor;        }    }      @Override    public String toString() {        StringBuilder sb = new StringBuilder();        generateBSTString(root,0,sb);        return sb.toString();    }     //直观打印,可以看到树的深度    private void generateBSTString(TreeNode root, int height, StringBuilder sb) {        if(root == null){            sb.append(generateHeightString(height)).append("NULL\n");            return;        }        sb.append(generateHeightString(height)).append(root.val).append("\n");        generateBSTString(root.left,height+1,sb);        generateBSTString(root.right,height+1,sb);    }     private String generateHeightString(int height) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < height; i++) {            sb.append("--");        }        return sb.toString();    }}

关于“Java如何实现二分搜索树”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯