首页 > 其他分享 >搜索树

搜索树

时间:2024-03-30 11:12:20浏览次数:24  
标签:right TreeNode cur val else 搜索 left

1. 二叉搜索树

1.1 二叉搜索树概念

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

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

如果中序遍历( 左根右 ),结果从小到大有序。所以,二叉搜索树也叫二叉排序树

 

1.2 二叉搜索树的实现

class BinarySearchTree {

    static class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    public TreeNode root;

    // 查找
    public boolean search(int val) {
        TreeNode cur = root;
        while (cur != null) {
            if (val == cur.val) {
                return true;
            }else if (val < cur.val) {
                cur = cur.left;
            }else {
                cur = cur.right;
            }
        }
        return false;
    }

    // 插入
    public void insert(int val) {
        TreeNode node = new TreeNode(val);
        if (root == null) {
            root = node;
            return;
        }

        // 先让cur走到null
        TreeNode cur = root;
        TreeNode prev = null;
        while (cur != null) {
            if (val > cur.val) {
                prev = cur;
                cur = cur.right;
            }else if (val < cur.val){
                prev = cur;
                cur = cur.left;
            }else {
                return;
            }
        }

        // 插入
        if (val > prev.val) {
            prev.right = node;
        }else {
            prev.left = node;
        }
    }

    // 删除节点
    public void remove(int val) {
        TreeNode cur = root;
        TreeNode prev = root;
        while (cur != null) {
            if (val > cur.val) {
                prev = cur;
                cur = cur.right;
            } else if (val < cur.val) {
                prev = cur;
                cur = cur.left;
            } else {
                removeNode(prev,cur);
                return;
            }
        }
    }

    private void removeNode(TreeNode parent,TreeNode cur) {
        if (cur.left == null) {
            if (cur == root) {
                root = cur.right;
            } else if (cur == parent.left) {
                parent.left = cur.right;
            }else {
                parent.right = cur.right;
            }
        } else if (cur.right == null) {
            if (cur == root) {
                root = cur.left;
            }else if (cur == parent.left) {
                parent.left = cur.left;
            }else {
                parent.right = cur.left;
            }
        } else {
            TreeNode cp = cur;
            TreeNode c = cur.right;
            while (c.left != null) {
                cp = c;
                c = c.left;
            }
            cur.val = c.val;
            if (cp.left == c) {
                cp.left = c.right;
            }else {
                cp.right = c.right;
            }
        }

    }

}

class Test {
    public static void main(String[] args) {
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        binarySearchTree.insert(10);
        binarySearchTree.insert(7);
        binarySearchTree.insert(15);
        binarySearchTree.insert(3);
        binarySearchTree.insert(20);
        binarySearchTree.insert(16);
        binarySearchTree.insert(12);
        binarySearchTree.remove(15);

     }
}

删除思路 分三种情况:

1. 删除节点左边为空

 

2. 删除节点右边为空

 

3. 删除节点左右都不为空

有2中删除思路 下面实现第二种

这里需要注意

标签:right,TreeNode,cur,val,else,搜索,left
From: https://www.cnblogs.com/xumu7/p/18103795

相关文章

  • 代码随想录第22天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.
    235. 二叉搜索树的最近公共祖先 235.二叉搜索树的最近公共祖先-力扣(LeetCode)代码随想录(programmercarl.com)二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百......
  • 算法进阶课之搜索
    在y总的算法进阶课里,主要讲了BFS和DFS虽然y总将二者又细分成了很多类别(bfs下面有floodfill、最短路模型、最小步数模型……)但个人感觉bfs没有必要分这么多种以下是一些总结:1、bfsvsdfs:前者可以用来求最短(保证第一次搜到的是最短的)但是需要用很多的空间,而且代码相对复杂一些;......
  • 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为
    文章目录669.修剪二叉搜索树解题思路源码108.将有序数组转换为二叉搜索树解题思路源码538.把二叉搜索树转换为累加树解题思路源码669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值......
  • 万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
    Sphinx官方文档:http://sphinxsearch.com/docs/sphinx3.html极简概括:由C++编写的高性能全文搜索引擎的开源组件,C/S架构,跨平台(支持Linux、Windows、MacOS),支持分布式部署,并可直接适配MySQL。解决问题:因为MySQL的like%keyword%不走索引,且全文索引不支持中文,所以需要借助其它......
  • 手机可以搜索到wifi,但电脑搜索不到WiFi无线网络的解决方法
    手机可以搜索到wifi,但电脑搜索不到WiFi无线网络的解决方法:  (重点先尝试一下后面的原因二)手机可以搜索到wifi,但电脑搜索不到WiFi无线网络的解决方法一般来说,手机如果可以搜索到路由器Wi-Fi无线信号,并且可以连上上网,说明路由器自身和设置肯定是没有任何问题的,这种情况下,笔记......
  • ElasticSearch搜索引擎介绍+性能监控及调优
    ElasticSearch搜索引擎介绍一、概述搜索在现代日常生活场景中都非常常见,如百度、京东、天猫等等。数据量都是庞大的,所以直接基于数据库搜索必定不是他们的首选,在这些场景下,要完成数据的高效搜索,都会基于搜索引擎实现。而对于搜索实现来说,市面上常见三种技术:Lucene、Solr......
  • 一类适合记忆化搜索的区间dp
    https://www.luogu.com.cn/problem/P5752https://codeforces.com/contest/598/problem/Ecf这个题考虑dp预处理,状态是三维的,转移是分割方案和所分块需要获得的巧克力数量。最后题目多次询问可以o(1)快速查询的//Problem:E.ChocolateBar//Contest:Codeforces-Educational......
  • ElasticSearch的搜索相关操作
    1、基本介绍Elasticsearch的查询是基于JSON风格的DSL(DomainSpecificLanguage)来实现的。常见的查询类型包括:查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(fulltext)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:match、multi_match精确......
  • 数据结构-二叉搜索树(Java实现)
    1.概念二叉搜索树也叫做二叉排序树,如果中序遍历,这棵二叉搜索树的结果就是有序的,它是具备以下性质的二叉树:若它的左子树不为空,则左子树上所有结点的值都小于根节点的值若它的右子树不为空,则右子树上所有结点的值都大于根节点的值它的左右子树也分别为二叉搜索树{5,3,......
  • 搜索引擎黑客语法
    逻辑符与(+或者空格)或(|)常用命令cache:www.baidu.com(寻找网页的缓存) allintext:hackingtools(在正文中寻找关键字)allintitle:医生和警察site:baidu.com(收集子域名)inurl:admin(关键字包含在url中)北极鲶鱼site:weibo.com因为互联网上的每一个资源都有url,所......