二叉搜索树

关于二叉树搜索树种,最难的部分是二叉搜索树的删除。

一、二叉搜索树概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树

在这里插入图片描述

二、二叉搜索树的操作

2.1查找

在这里插入图片描述

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

2.2插入

二叉搜索树中不能插入val相同的结点
在这里插入图片描述

  public void insert(int val){
        if (root == null){
            root = new TreeNode(val);
            return;
        }
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null){
            if (cur.val < val ){
                parent = cur;
                cur = cur.right;
            }else if (cur.val > val){
                parent = cur;
                cur = cur.left;
            }else {
                //相等时退出,因为搜索二叉树不允许有相等的值
                return;
            }
        }
        TreeNode node = new TreeNode(val);
        if (parent.val < val){
            parent.right = node;
        }else {
            parent.left = node;
        }
    }

2.3删除

在这里插入图片描述
在这里插入图片描述
我们设待删除的结点为cur,待删除结点的双亲结点为parent

当cur.left == null.
1.若cur是root,则root = cur.right
2.cur不是root,cur是parent.left,则parent.left = cur. right
3.cur不是root,cur是parent.right,则parent.right = cur.right

在这里插入图片描述
在这里插入图片描述

  if (cur.left == null){
                //左边为空的情况
                if (cur == root){
                   root = cur.right;
                }else if (cur == parent.left){
                    parent.left = cur.right;
                }else {
                    parent.right = cur.right;
                }
            }

右边为空

当cur.right == null.
1.若cur是root,则root = cur.left
2.cur不是root,cur是parent.left,则parent.left = cur. left
3.cur不是root,cur是parent.right,则parent.right = cur.left

在这里插入图片描述
在这里插入图片描述

                  if (cur == root){
                      root = cur.left;
                  }else if (cur == parent.left){
                      parent.left = cur.left;
                  }else {
                      parent.right = cur.left;
                  }

当左右都有结点时
在这里插入图片描述

在这里插入图片描述

else {//两边都不为空
                 TreeNode t = cur.right;
                 TreeNode tp = cur;//tp是t的父亲结点
                 while (t.left != null){
                     tp = t;
                     t = t.left;
                 }
                 cur.val = t.val;
                 if (tp.left == t){
                     //第一种情况
                     tp.left = t.right;
                 }else {
                     //第二种情况
                     tp.right = t.right;
                 }

完整代码

 public void revome(int val){
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null){
            if (cur.val < val){
                parent = cur;
                cur = cur.right;
            }else if (cur.val > val){
                parent = cur;
                cur = cur.left;
            }else {
                revomeNode(parent,cur);
                return;
            }
        }
    }
    public void revomeNode(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 t = cur.right;
                 TreeNode tp = cur;
                 while (t.left != null){
                     tp = t;
                     t = t.left;
                 }
                 cur.val = t.val;
                 if (tp.left == t){
                     //第一种情况
                     tp.left = t.right;
                 }else {
                     //第二种情况
                     tp.right = t.right;
                 }
            }
    }

三、二叉搜索树性能

删除和插入都需要查找,也就是说二叉搜索树的性能取决于查找的效率
在这里插入图片描述

最好的情况:完全二叉树,平均比较次数log2N。
最坏的情况:单支树,平均比较次数N/2。

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 12:58:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 12:58:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 12:58:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 12:58:02       18 阅读

热门阅读

  1. Jetty的ssl模块

    2024-03-10 12:58:02       22 阅读
  2. Linux的环境安装以及项目部署

    2024-03-10 12:58:02       20 阅读
  3. WPF Interaction

    2024-03-10 12:58:02       21 阅读
  4. 当Github启用PSA之后...

    2024-03-10 12:58:02       18 阅读
  5. 鸿蒙 进程模型-公共事件

    2024-03-10 12:58:02       19 阅读
  6. 解释 Git 的基本概念和使用方式

    2024-03-10 12:58:02       20 阅读
  7. VGG16-CF-VGG11实验报告

    2024-03-10 12:58:02       23 阅读
  8. vscode中开发goalng,debug时遇到的tools报错问题

    2024-03-10 12:58:02       21 阅读