二叉搜索树|查找、插入、删除图解

二叉搜索树

概念

右子树上所有节点的值均大于根节点的值

左子树上所有结点的值均小于根节点的值

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

操作

查找(target)
  • 若根节点不为空

    • 若根节点.key == target,返回true
    • 若根节点.key > target,在左子树查找
    • 若根节点.key < target,在右子树查找
  • 若根节点为空,返回false

    //查找
    public static boolean search(int target) {
        if (root == null) { //加了static root 不可用了
            return false;
        }
        TreeNode cur = root;
        while (cur != null) {
            if (cur.key == target) {
                return true;
            } else if (cur.key > target) {
                cur = cur.left;
            } else {
                cur = cur.right;
            }
        }
        return false;
    }
插入(key,value)
  • 若根节点为空

    • 直接插入
  • 若根节点不为空

    • 遍历

      • 若cur.key == key,返回
      • 若cur.key > key,当前节点标记为父节点,进入左子树
      • 若cur.key < key,当前节点标记为父节点,进入右子树
    • 判断

      • 若parent.key>key,该节点插入到左子树中
      • 否则插入到右子树中
    //建树
    public static void insert(int key, int val) {
        TreeNode node = new TreeNode(key, val);
        if (root == null) {
            root = node;
            return;
        }
        TreeNode parent = null;
        TreeNode cur = root;
        while (cur != null) {
            if (cur.key == key) {
                //该节点已存在
                return;
            } else if (cur.key > key) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        } //循环结束后,cur == null
        if (key < parent.key) {
            parent.left = node;
        } else {
            parent.right = node;
        }
    }
删除(key)
  • 遍历找到待删除结点为cur,其双亲为parent

    • cur.left == null

      • cur == root --> root = cur.right

      • cur != root && cur == parent.left --> parent.left = cur.right
        在这里插入图片描述

      • cur != root && cur == parent.right --> parent.right = cur.right
        -

    • cur.right == null

      • cur == root --> root = cur.left

      • cur != root && cur == parent.left --> parent.left = cur.left

      • cur != root && cur == parent.right --> parent.right = cur.left

    • cur.left != null && cur.right != null

      • 找替罪羊:找右子树最左侧元素 or 找左子树最右侧元素
      • 赋值:待删结点的值为替罪羊的值
      • 删去替罪羊:goatParent._ = goat._
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值