美文网首页
二叉查找树

二叉查找树

作者: wayyyy | 来源:发表于2017-09-20 23:17 被阅读0次
定义

二叉查找树或者是一棵空树,或者是具有下列性质的二叉树

  • 若左子树不空,则左子树上所有结点的值均小于它的根节点的值;
  • 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 左、右子树也分别为二叉排序树;
二叉查找树.png
二叉查找树的删除算法

二叉查找树的删除分为3种情况:

  • 待删节点是叶子节点
  • 待删节点只有一棵子树
    • 只有左子树
    • 只有右子树
  • 待删节点有左右子树
待删节点是叶子节点
叶子节点.jpg

直接将父结点的相应指针修改为空。

待删节点只有一棵子树
只有一棵子树.png

将要删除的父结点的相应子结点指针指向要删除的结点的唯一子结点

待删节点有左右子树

【1】 找到该右子树中最小的结点(即一直往左走)。
【2】 复制key。
【3】调整树。

有左右子树.png
template <typename Key>
void BSTree<Key>::remove(const Key &key) {
    root = deleteNode(key, root);
}

template <typename Key>
typename BSTree<Key>::BSTNodePtr BSTree<Key>::deleteNode(const Key& key, BSTNodePtr x) {
    if (x == nullptr)
        return nullptr;

    if (key > x->key )
        x->right = deleteNode(key, x->right);
    else if (key < x->key)
        x->left = deleteNode(key, x->left);
    else {
        /* 叶子节点 */
        if (x->right == nullptr && x->left == nullptr) {
            delete x;
            count--;
            return nullptr;
        }
        /* 只有一颗子树 */
        else if (x->left != nullptr && x->right == nullptr) {
            BSTNodePtr tmp = x->left;
            delete x;
            count--;
            return tmp;
        }
        else if (x->left == nullptr && x->right != nullptr) {
            BSTNodePtr tmp = x->right;
            delete x;
            count--;
            return x->right;
        }
        /* 有左右子树 */
        else {
            BSTNodePtr rightMinNode = minNode(x->right);
            x->key = rightMinNode->key;
            deleteMinNode(x->right);
        }
    }

    return x;
}

分析

  • 在一棵二叉查找树中,所有操作在最坏情况下所需要的时间和树的高度成正比

相关文章

  • 极客时间数据结构与算法之美笔记25~26

    二叉树到二叉查找树,是为了查找数据的效率接近logN。 二叉查找树到平衡二叉查找树,是为了防止二叉查找树沦为链表。...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 红黑树

    红黑树的本质就是一棵二叉查找树,所以先从二叉查找树来了解起。 二叉查找树 二叉查找树又称有序二叉树,具有以下特性:...

  • 二叉查找树

    二叉查找树,又称二叉搜索树 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: ...

  • 99-数据结构和算法

    难点:二叉树的遍历 红黑树 图的遍历 二叉查找树二叉查找树(binary search tree),二叉查找树在二...

  • 11-二叉查找树

    二叉查找树 1.什么是二叉查找树? 二叉查找树是一种支持数据动态的插入,删除,查找的数据结构。 2.二叉查找树的设...

  • 17张图带你解析红黑树的原理!保证你能看懂!

    二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找树(Bin...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 6. 二叉树创建-查找

    1. 递归方式实现二叉树的构建2. 树、二叉树、二叉查找树3. 二叉树排序树的理解4. 二叉查找树5. 二叉树的查找

  • 数据结构中的各种树

    一、二叉树 二、二叉查找树(又称二叉排序树,二叉搜索树) 二叉查找树(Binary Search Tree)它或者...

网友评论

      本文标题:二叉查找树

      本文链接:https://www.haomeiwen.com/subject/qbknsxtx.html