广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++二叉搜索树的操作有哪些
  • 726
分享到

C++二叉搜索树的操作有哪些

2023-06-29 15:06:33 726人浏览 八月长安
摘要

本文小编为大家详细介绍“c++二叉搜索树的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++二叉搜索树的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。二叉搜索树概念与操作二叉搜索树的概念二

本文小编为大家详细介绍“c++二叉搜索树的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++二叉搜索树的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    二叉搜索树概念与操作

    二叉搜索树的概念

    二叉搜索树又称二叉排序树,若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都大于根节点的值,它的左右子树也分别未二叉搜索树。也可以是一颗空树。

    C++二叉搜索树的操作有哪些

    int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 };

    二叉搜索树的操作

    查找

    C++二叉搜索树的操作有哪些

    迭代:

    node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return cur;}}return nullptr;}

    递归

    Node* _FindR(Node* root, const K& key){if (root == nullptr)return nullptr;if (root->_key < key)return _FindR(root->_right, key);else if (root->_key > key)return _FindR(root->_left, key);elsereturn root;}
    插入

    树为空,则直接插入

    C++二叉搜索树的操作有哪些

    树不为空,按二叉搜索树性质查找插入位置,插入新节点

    C++二叉搜索树的操作有哪些

    迭代:

    bool Insert(const K& key){if (_root == nullptr){_root = new Node(key);return true;}//查找要插入的位置Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(key);if (parent->_key < cur->_key){parent->_right = cur;}else{parent->_left = cur;}return true;}

    递归:

    bool _InsertR(Node*& root, const K& key){if (root == nullptr){root = new Node(key);return true;}else{if (root->_key < key){return _InsertR(root->_left, key);}else if (root->_key > key){return _InsertR(root->_left, key);}else{return false;}}}
    删除

    首先查找元素是否在二叉搜索树中,如果不存在,则返回,否则要删除的结点可能分下面四种情况:

    • 要删除的结点无孩子结点

    • 要删除的结点只有左孩子结点

    • 要删除的结点只有右孩子结点

    • 要删除的结点只有左、右结点

    实际情况中1和2或3可以合并,因此真正的删除过程如下:

    • 删除该结点且使被删除结点的双亲结点指向被删除结点的左孩子结点

    • 删除该结点且使被删除结点的双亲结点指向被删除结点的右孩子结点

    • 替代法。在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除结点中,再来处理该结点的删除问题。

    迭代:

    bool Erase(const K& key){Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{//删除if (cur->_left == nullptr){if (cur == _root){_root = cur->_right;}else{if (cur == parent->_left){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}}else{//找到右树最小节点去替代删除Node* minRightParent = cur;Node* minRight = cur->_right;while (minRight->_left){minRightParent = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;if (minRight == minRightParent->_left)minRightParent->_left = minRight->_right;elseminRightParent->_right = minRight->_right;delete minRight;}return true;}}return false;}

    递归:

    bool _EraseR(Node*& root, const K& key){if (root == nullptr)return false;if (root->_key < key){return _EraseR(root->_right, key);}else if (root->_key > key){return _EraseR(root->_left, key);}else{//删除Node* del = root;if (root->_left == nullptr){root = root->_right;}else if (root->_right == nullptr){root = root->_left;}else{//替代法删除Node* minRight = root->_right;while (minRight->_left){minRight = minRight->_left;}root->_key = minRight->_key;//转换成递归在右子树中删除最小节点return _EraseR(root->_right, minRight->_key);}delete del;return true;}}

    二叉搜索树的应用

    K模型:K模型即只有key作为关键码,结构中只需要存储key即可,关键码即为需要搜索到的值。比如:给一个单词Word,判断该单词是否拼写正确。具体方法如下:1.以单词集合中的每个单词作为key,构建一棵二叉搜索树。2.在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。

    KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。该种方式在现实生活中非常常见:比如英汉词典就是英语与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出现次数就是<word, count>就构成一种键值对。

    比如:实现一个简单的英汉词典dict,可以通过英文找到与其对应的中文,具体实现方式如下:1.<单词,中文含义>为键值对构造二叉搜索树,注意:二叉搜索树需要比较,键值对比较时只比较Key。2.查询英文单词时,只需要给出英文单词,就可快速找到与其对应的Key。

    namespace KEY_VALUE {template<class K, class V>struct BSTreeNode{BSTreeNode<K, V>* _left;BSTreeNode<K, V>* _right;K _key;V _value;BSTreeNode(const K& key, const V& value):_left(nullptr),_right(nullptr),_key(key),_value(value){}};template<class K, class V>class BSTree {typedef BSTreeNode<K, V> Node;public:V& operator[](const K& key){pair<Node*, bool> ret = Insert(key, V());return ret.first->_value;}pair<Node*, bool> Insert(const K& key, const V& value){if (_root == nullptr){_root = new Node(key, value);return make_pair(_root, true);}//查找要插入的位置Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{return make_pair(cur, false);}}cur = new Node(key, value);if (parent->_key < cur->_key){parent->_right = cur;}else{parent->_left = cur;}return make_pair(cur, true);}Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return cur;}}return nullptr;}bool Erase(const K& key){Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{//删除if (cur->_left == nullptr){if (cur == _root){_root = cur->_right;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_right;}}delete cur;}else{//找到右树最小结点去替代删除Node* minRightParent = cur;Node* minRight = cur->_left;while (minRight->_left){minRightParent = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;if (minRight = minRightParent->_left)minRightParent->_left = minRight->right;elseminRightParent->_right = minRight->_right;delete minRight;}return true;}}return false;}void InOrder(){_InOrder(_root);cout << endl;}private:void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->_left);cout << root->_key << ":" << root->_value << endl;_InOrder(root->_right);}private:Node* _root = nullptr;};}
    void Test2(){KEY_VALUE::BSTree<string, string> dict;dict.Insert("sort", "排序");dict.Insert("insert", "插入");dict.Insert("tree", "树");dict.Insert("right", "右边");string str;while (cin >> str){if (str == "q"){break;}else{auto ret = dict.Find(str);if (ret == nullptr){cout << "拼写错误,请检查你的单词" << endl;}else{cout << ret->_key <<"->"<< ret->_value << endl;}}}}

    C++二叉搜索树的操作有哪些

    void Test3(){//统计字符串出现次数,也是经典key/valuestring str[] = { "sort", "sort", "tree", "insert", "sort", "tree", "sort", "test", "sort" };KEY_VALUE::BSTree<string, int> countTree;//for (auto& e : str)//{//auto ret = countTree.Find(e);//if (ret == nullptr)//{//countTree.Insert(e, 1);//}//else//{//ret->_value++;//}//}for (auto& e : str){countTree[e]++;}countTree.InOrder();}

    C++二叉搜索树的操作有哪些

    二叉树的性能分析

    插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

    对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,比较的次数越多。

    但对于同一个关键码集合,如果关键码插入的次序不同,可能得到不同结构的二叉搜索树

    C++二叉搜索树的操作有哪些

    最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:logN

    最差情况下,二叉搜索树退化为单支树,其平均比较次数为:N/2

    读到这里,这篇“C++二叉搜索树的操作有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

    --结束END--

    本文标题: C++二叉搜索树的操作有哪些

    本文链接: https://www.lsjlt.com/news/325601.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++二叉搜索树的操作有哪些
      本文小编为大家详细介绍“C++二叉搜索树的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++二叉搜索树的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。二叉搜索树概念与操作二叉搜索树的概念二...
      99+
      2023-06-29
    • python实现二叉搜索树的方法有哪些
      这篇文章主要介绍“python实现二叉搜索树的方法有哪些”,在日常操作中,相信很多人在python实现二叉搜索树的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现二叉搜索树的方法有哪些...
      99+
      2023-07-06
    • JavaScript二叉搜索树构建操作详解
      目录前言什么是二叉搜索树构建一颗二叉搜索树二叉搜索树的操作向二叉搜索树中插入数据查找二叉搜索树中的数据删除二叉搜索树的某个节点前驱后继节点删除一个节点的三种情况实现代码完整代码总结前...
      99+
      2022-11-13
    • 如何在Java中操作二叉搜索树
      如何在Java中操作二叉搜索树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、二叉搜索树插入元素     class&n...
      99+
      2023-06-15
    • Java基础之二叉搜索树的基本操作
      目录一、二叉搜索树插入元素二、搜索指定节点三、删除节点方式一四、删除节点方式二五、运行结果一、二叉搜索树插入元素 class Node { int v...
      99+
      2022-11-12
    • JavaScript二叉搜索树构建操作实例分析
      本篇内容介绍了“JavaScript二叉搜索树构建操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是二叉搜索树二叉搜索树首先它...
      99+
      2023-07-02
    • 【C++】平衡二叉搜索树的模拟实现
      🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 ...
      99+
      2023-09-11
      c++ 开发语言
    • C++实现LeetCode(96.独一无二的二叉搜索树)
      [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树 Given n, how many structurally un...
      99+
      2022-11-12
    • C++实现LeetCode(95.独一无二的二叉搜索树之二)
      [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二 Given an integer n, generate...
      99+
      2022-11-12
    • C++使用LeetCode实现独一无二的二叉搜索树
      这篇文章主要介绍C++使用LeetCode实现独一无二的二叉搜索树,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树...
      99+
      2023-06-20
    • C++详解数据结构中的搜索二叉树
      目录定义查找某个元素构造搜索二叉树往搜索二叉树中插入元素搜索二叉树删除节点定义 搜索二叉树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1、若任意节点的左子树...
      99+
      2022-11-13
    • C++数据结构之搜索二叉树的实现
      目录零.前言1.概念2.作用3.迭代实现(1)查找(2)插入(3)删除4.递归实现(1)查找(2)插入(3)删除5.key/value模型的应用(1)对应查找(2)判断出现次数6.总...
      99+
      2022-11-13
    • Java创建二叉搜索树,实现搜索,插入,删除的操作实例
      Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除)首先我们要有一个编码的思路,大致如下: 1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走!2、...
      99+
      2023-05-30
      java 二叉搜索树 搜索
    • C语言实现二叉搜索树的完整总结
      目录1、 二叉树的构建2、二叉树的遍历前序遍历中序遍历后序遍历层序遍历4、二叉树的高度5、二叉树的删除6、由几种遍历序列还原二叉树 前序序列、中序序列还原二叉树:中序序列、...
      99+
      2022-11-12
    • C++实现LeetCode(108.将有序数组转为二叉搜索树)
      [LeetCode] 108.Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树 Given an array wher&...
      99+
      2022-11-12
    • C++实现LeetCode(109.将有序链表转为二叉搜索树)
      [LeetCode] 109.Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树 Given a singly linked...
      99+
      2022-11-12
    • C语言二叉树的操作方法
      本篇内容主要讲解“C语言二叉树的操作方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言二叉树的操作方法”吧!二叉树分类满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二...
      99+
      2023-06-30
    • C++数据结构之二叉搜索树的实现详解
      目录前言介绍实现节点的实现二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除总结前言 今天我们来学一个新的数据结构:二叉搜索树。 介绍 二叉搜索树也称作二叉排序树,它具有以下性质: 非...
      99+
      2022-11-13
    • C++ AVLTree高度平衡的二叉搜索树怎么实现
      这篇“C++ AVLTree高度平衡的二叉搜索树怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++&nb...
      99+
      2023-07-05
    • C++AVLTree高度平衡的二叉搜索树深入分析
      目录一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋五、进行验证六、AVLTree的性能一、AVL树的概念 二...
      99+
      2023-03-08
      C++ AVLTree二叉搜索树 C++高度平衡二叉搜索树
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作