二叉搜索树

简介: 二叉搜索树

1 二叉搜索树的概念

二叉搜索树是可以特殊的二叉树,也叫二叉排序树

特点:

1 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

2 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

3 它的左右子树也分别为二叉搜索树

4 中序遍历是有序的


2 二叉搜索树的查找

思路:主要就是依据二叉搜索树的特点,右边的数值会更大,左边的会更小

    public boolean find(int val){
        //根节点为空,说明是一棵空树
        if (root==null)return false;
        Node cur = root;
        while (cur!=null){
            if(val>cur.val){//说明在数的右边
                cur=cur.right;
            }else if(val== cur.val){//找到了
                return true;
            }else{//说明在树的左边
                cur=cur.left;
            }
        }
        //说明没有找到
        return false;
    }

3 二叉搜索树的插入

    public boolean insert(int val){
        if (root==null){
            //头结点为空,则刚插入进来的节点就是根节点
            root = new Node(val);
            return true;
        }
        Node cur = root;
        Node parent = null;//用来记录cur上一个位置
        while (cur!=null){
            if (val>cur.val){
                parent=cur;
                cur=cur.right;
            }else if(cur.val==val){
                return false;
            }else{
                parent=cur;
                cur=cur.left;
            }
        }
        Node node = new Node(val);
        if (val>parent.val){
            parent.right=node;
        }else{
            parent.left=node;
        }
        return true;
    }

4 二叉搜索树的删除(重点)

4.1 cur.left==null时

当cur.left==null时则有一下情况


4.2 cur.right==null时

4.3 cur.left!=null&&cur.right!=null时

思路:我们采用替换法,就是利用parent和cur的方法,先找到cur所在的位置,在定义一个变量tmp指向cur,另一个tag变量等于cur.right,然后从cur的右树中去寻找到最小值,然后tag找到最小值的位置后,在让cur的值等于这个最小值,接下来就变成了删除tag了,删除tag有以下两种情况:


结合以上的所有情况,所以代码如下:

    public void remove(int val){
        if(root==null)return;
        Node cur = root;
        Node parent = null;
        //找要删除的值
        while (cur!=null){
            if (val>cur.val){
                parent=cur;
                cur=cur.right;
            }else if(val== cur.val){
                toremove(cur,parent);
                break;
            }else{
                parent=cur;
                cur=cur.left;
            }
        }
    }
    public void toremove(Node cur,Node parent){
        if(cur.left==null){
            if(cur.left==null){
                if(cur==root){
                    root=root.right;
                }
                if(parent.left==cur){
                    parent.left=cur.right;
                }
                if (parent.right==cur){
                    parent.right=cur.right;
                }
            }else if(cur.right==null){
                if(cur==root){
                    root=root.right;
                }
                if(parent.right==cur){
                    parent.right=cur.left;
                }
                if(parent.left==cur){
                    parent.left=cur.left;
                }else{
                    Node tmp = cur;
                    Node tag = cur.right;
                    while (tag.left!=null){
                        tmp=tag;
                        tag=tag.left;
                    }
                    //交换
                    cur.val= tag.val;
                    //删除tag
                    if (tmp.right==tag){
                        tmp.right=tag.right;
                    }else{
                        tmp.left=tag.right;
                    }
                }
        }
    }


5 总结:

对于二叉搜索树而言最核心的部门还是依据右树会比左树大,左树比右树大的特点,最为核心的部门其实还是对于二叉搜索树的删除操作,比较难理解,情况众多,其实见多了也自然就会了!!

目录
相关文章
|
12月前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
340 23
|
存储 Python
动态规划(Dynamic Programming, DP)
动态规划(Dynamic Programming, DP)
153 2
|
SQL Oracle 关系型数据库
加索引导致表被锁的原因及处理方法
加索引导致表被锁的原因及处理方法
1182 0
|
存储 安全 搜索推荐
基因编辑:精准医疗与生物进化的新篇章
【9月更文挑战第11天】基因编辑技术作为精准医疗与生物进化的新篇章,正以前所未有的速度改变着我们的世界。它为我们提供了治疗遗传性疾病、实现个性化医疗、探索生物进化奥秘的新途径。然而,在享受技术带来的便利的同时,我们也需要清醒地认识到其面临的挑战和伦理考量。只有以开放、审慎的态度面对这一技术,充分发挥其潜力并避免潜在风险,我们才能确保基因编辑技术的健康发展,为人类带来更多的福祉和改变。
|
算法 Python
python常用算法(5)——树,二叉树与AVL树(二)
python常用算法(5)——树,二叉树与AVL树
|
XML 存储 Java
五分钟实现pdf分页
抱歉也开始用了这么“标题党”的标题。事情起源于前几天需要把个人资料的pdf文档一页一页的拆出来,好传到相关的网站上。直接截图到word再转pdf比较麻烦,所以想用工具直接转换。结果找了几个pdf阅读器,这类操作都需要会员或收费。作为一名程序员,这么简单的操作还要收费显然是一种羞耻(当然我是不会承认主要是因为qiong的),几分钟就可以代码解决的问题为啥要花钱呢?废话不多说,开搞。
465 0
|
Linux 网络安全
Linux命令(10)之tty
Linux命令(10)之tty
367 1
|
Python
LeetCode 268. 丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
193 0
|
缓存 Shell 开发工具
Git操作技巧之忽略特殊文件
引入 团队开发经常用git的朋友知道,git是基于工作目录的版本控制工具—— 意思是说,你在提交一个版本到git仓库的时候会把这个工作目录的文件都提交上去 这可万万使不得啊。 想想有的文件里存有你的用户名和密码,有些文件有cookie等敏感信息…… 但是总不可能不提交,或者干脆为了这些零零碎碎的文件重新创建目录吧? 这时候,我们就需要用到Git忽略文件的操作了——
Git操作技巧之忽略特殊文件