二叉搜索树

简介: 二叉搜索树

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 总结:

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

目录
相关文章
|
5月前
|
存储 C++
二叉树搜索树的应用
二叉树搜索树的应用
35 1
|
5天前
二叉搜索树
二叉搜索树
13 2
|
5天前
|
存储 安全 C++
C++【二叉搜索树】
C++【二叉搜索树】
41 0
|
7月前
51 # 二叉搜索树的实现
51 # 二叉搜索树的实现
19 0
|
9月前
|
编译器 C语言 C++
【C++】二叉搜索树
【C++】二叉搜索树
41 0
|
9月前
|
存储
【二叉搜索树】
【二叉搜索树】
34 0
|
10月前
|
存储 算法 关系型数据库
有了二叉树,平衡二叉树为什么还需要红黑树
有了二叉树,平衡二叉树为什么还需要红黑树
67 0
有了二叉树,平衡二叉树为什么还需要红黑树
|
11月前
|
算法
二叉搜索树、平衡二叉树
一、二叉搜索树 这里我们不用太多书面化的语言来定义,笔者认为在讨论数据结构、算法相关的内容时用太多书面化、学术化的语言是一种让人很烦的事情。咬文嚼字,不便于读者理解。 简单来说二叉树搜索树,其实就是用来做二分查找的一种二叉树。 特点是:根节点的左子树值均小于根节点的值,根节点的右子树值均大于根节点的值。 比如123 4 567建树的结果就是
38 0
|
12月前
|
C++
【C++】二叉搜索树(下)
【C++】二叉搜索树
40 0
|
12月前
|
C++
【C++】二叉搜索树(上)
【C++】二叉搜索树
48 0