当前位置: 首页 > news >正文

新网 如何建设网站收费网站必须备案吗

新网 如何建设网站,收费网站必须备案吗,第三方小程序开发平台有哪些,google首页1、二叉搜索树的概念 二叉搜索树又叫做二叉排序树,他或者是一棵空树,或者具有以下性质: 若他的左子树不为空,则左子树的所有节点的值都小于根节点的值, 若他的右子树不为空,则右子树的所有节点的值都大于…

1、二叉搜索树的概念

二叉搜索树又叫做二叉排序树,他或者是一棵空树,或者具有以下性质:

若他的左子树不为空,则左子树的所有节点的值都小于根节点的值,

若他的右子树不为空,则右子树的所有节点的值都大于根节点的值,

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

2、二叉搜索树的操作

  int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};

1.二叉搜索树的查找

从根节点开始找,比根大往右边查找,比根小往左边查找,最多查找高度次,走到空还没找到,则该值不存在;

2.二叉搜索树的插入

若树为空,则新增节点,赋值给root指针,

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

 3.二叉搜索树的删除

首先查找元素是否在二叉搜索树中,如果不存在,则返回,如果存在,则分为以下四种情况:

a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点
其实a情况可以和b c 情况合并起来,这样我们只需要考虑三种删除方式:
情况b: 删除该节点,并使该节点的父亲节点指向删除节点的左节点
情况c:删除该节点,并使该节点的父亲节点指向删除节点的右节点
情况d:替换法,找到该节点右子树的最小节点或者左子树的最大节点,与该节点替换,然后删除右子树的最小节点或左子树的最大节点;

4.二叉搜索树的实现

#pragma once#include<iostream>
#include<string>
using namespace std;
namespace key
{template<class K>struct BSTreeNode{BSTreeNode<K>* _left;BSTreeNode<K>* _right;K _key;BSTreeNode(const K& key):_left(nullptr),_right(nullptr),_key(key){ }};template<class K>class BSTree{typedef BSTreeNode<K> Node;public: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 < key){parent->_right = cur;}else{parent->_left = cur;}return true;}bool 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{cout << "true" << endl;return true;}}cout << "false" << endl;return false;}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 (parent->_left == cur){parent->_left = cur->_right;}else{parent->_right=cur->_right;}}delete cur;}//右为空,父亲指向我的左else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (parent->_left == cur){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{//左右都不为空,替换法//查找右子树的最小节点或左子树的最大节点//我们这里找右子树的最小节点(也就是最左节点)Node* rightMinParent = cur;Node* rightMin = cur->_right;while (rightMin->_left){rightMinParent = rightMin;rightMin = rightMin->_left;}swap(cur->_key, rightMin->_key);if (rightMinParent->_left == rightMin){rightMinParent->_left = rightMin->_right;}else{rightMinParent->_right = rightMin->_right;}delete rightMin;}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 << " ";_InOrder(root->_right);}Node* _root = nullptr;};void TestBSTree1(){BSTree<int> b;b.Insert(1);b.Insert(2);b.Insert(3);b.Insert(4);b.Insert(5);b.Find(6);b.Find(3);b.Find(5);b.InOrder();}void TestBSTree2(){int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };BSTree<int> t1;for (auto e : a){t1.Insert(e);}/*t1.InOrder();t1.Erase(8);t1.InOrder();*/for (auto e : a){t1.Erase(e);t1.InOrder();}}
}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:bool Insert(const K& key, const V& value){if (_root == nullptr){_root = new Node(key,value);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,value);if (parent->_key < key){parent->_right = cur;}else{parent->_left = cur;}return 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 cur;}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 (parent->_left == cur){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}delete cur;}//右为空,父亲指向我的左else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (parent->_left == cur){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{//左右都不为空,替换法//查找右子树的最小节点或左子树的最大节点//我们这里找右子树的最小节点(也就是最左节点)Node* rightMinParent = cur;Node* rightMin = cur->_right;while (rightMin->_left){rightMinParent = rightMin;rightMin = rightMin->_left;}swap(cur->_key, rightMin->_key);if (rightMinParent->_left == rightMin){rightMinParent->_left = rightMin->_right;}else{rightMinParent->_right = rightMin->_right;}delete rightMin;}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 << " ";_InOrder(root->_right);}Node* _root = nullptr;};void TestBSTree3(){BSTree<string, string> dict;dict.Insert("string", "字符串");dict.Insert("left", "左边");dict.Insert("insert", "插入");string str;while (cin >> str){BSTreeNode<string, string>* ret = dict.Find(str);if (ret){cout << ret->_value << endl;}else{cout << "无此单词,请重新输入" << endl;}}}void TestBSTree4(){// 统计次数string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };BSTree<string, int> countTree;for (const auto& str : arr){auto ret = countTree.Find(str);if (ret == nullptr){countTree.Insert(str, 1);}else{ret->_value++;}}countTree.InOrder();}}

5、二叉搜索树的应用

1.K模型:K模型只有key作为关键码,结构中只需要存储key即可,关键码即为需要搜索到的值;

比如:给一个单词word,判断该单词是否拼写正确,

2.K-V模型:每一个关键码都对应一个Value,即<Key,value>的键值对,

比如:英汉字典中用英文与中文的对应关系,通过英文可以快速找到对应的中文,

6、二叉搜索树的性能分析

对于有n个节点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是高度次,但对于同一个关键码集合,如果插入的次序不同,可能得到不同结构的二叉树:

 

最优情况下,二叉搜索树为完全二叉树(或者接近完全二叉树),其平均比较次数为:O(logN)
最差情况下,二叉搜索树退化为单支树(或者类似单支),其平均比较次数为O(N);

 

http://www.yayakq.cn/news/151541/

相关文章:

  • 广州php网站建设yandex搜索引擎入口
  • 怎么在阿里巴巴网站做公司会做网站怎么赚钱
  • 区块链资讯网站建设哪家网站建设专业
  • 基于jsp的电子商务网站开发网页界面模板下载
  • 淘宝客网站制作教程北京电商网站建设外包
  • 江苏网站建设价格上海营业执照查询系统
  • 一键网站制作献县网站建设公司
  • 安徽建设部网站建立企业网站的技能
  • 哪里有做网站服务网站收录是什么
  • 建设银行信用卡境外网站盗刷学生html个人网站模板
  • 北镇网站建设网站建设公司怎么写宣传语
  • wordpress+整站下载阿里云的企业网站建设
  • 北京城建亚泰建设集团有限公司网站百度导航是哪个国家的公司
  • 在哪个网站上做实验仪器比较好广告设计培训机构哪家好
  • 网站建设与网页设计视频中小企业服务中心网站建设
  • 网站服务器无法访问网站后台 教程
  • 廊坊网站建设制作个人单页网站建设
  • 自己做网站要不要租服务器游戏分类网站怎么做
  • 关于京东商城网站建设的实践报告盐城seo网站优化软件
  • 无锡制作网站公司哪家好河北邢台是不是很穷
  • 虚拟网站php专业型中国建筑app下载
  • 网站建设需不需要编程wordpress汉化插件下载地址
  • 高端产品网站wordpress git themes
  • 网站建站公司哪家价钱合理在线3d建模网站
  • 做网站菠菜什么意思有限公司与有限责任公司的区别
  • sqlite3做网站数据库wordpress app主题
  • 百度图在图不留网站方常见的网站建设程序有哪些
  • 如何一键建淘宝客网站好听的网络科技公司名字
  • 个人网站可以名字写官网吗网页设计教学设计
  • 苏州大型网站设计公司google推广有效果吗