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

宁波建设银行网站首页全网营销系统

宁波建设银行网站首页,全网营销系统,三网合一网站源码下载,中国建行官方网站一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

一、概念

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

在这里插入图片描述


二、二叉搜索树的操作

1. 查找

  • 从根开始比较,查找,比根大往右边走查找,比根小往左边走查找
  • 最多查找高度次,走到空,还没找到,这个值不存在

2. 插入

插入的具体过程如下:

  • 树为空,则直接新增节点,赋值给root指针
  • 树不空,按二叉搜索树性质查找插入位置,插入新节点

3. 删除

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

a. 要删除的结点无孩子结点

b. 要删除的结点只有左孩子结点

c. 要删除的结点只有右孩子结点

d. 要删除的结点有左、右孩子结点

情况a可以与情况b或者c合并起来,因此真正的删除过程如下:

  • 情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点直接删除
  • 情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点直接删除
  • 情况d:在它的右子树中寻找中序下的第一个结点(关键码在右子树中最小),用它的值填补到被删除节点中,再来处理该结点的删除问题–替换法删除

图片描述

依次删除上图的7、14、3、8
7、14属于直接删除的场景
3、8属于需要替换法进行删除的场景


三、二叉搜索树的实现

1. 基本框架

namespace K
{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:BSTree():_root(nullptr){}//……各种函数private:Node* _root;};
}

2. 构造和析构

namespace nb
{//……template<class K>class BSTree{typedef BSTreeNode<K> Node;public:BSTree():_root(nullptr){}BSTree(const BSTree<K>& tree){_root = Copy(tree._root);}~BSTree(){Destroy(_root);}private:Node* Copy(Node* root){if (root == nullptr) return nullptr;//前序构建树Node* newRoot = new Node(root->_k);newRoot->_left = Copy(root->_left);newRoot->_right = Copy(root->_right);return newRoot;}void Destroy(Node* root){if (root == nullptr) return;//后序销毁树Destroy(root->_left);Destroy(root->_right);delete root;}private:Node* _root;};
}

3. 查找

实现可以使用迭代,也可以使用递归。
递归版本需要写一个子函数,因为类外部是不能直接访问私有成员变量_root的

bool Find(const K& key)
{Node* cur = _root;while (cur){if (key > cur->_key){//大了往右边查找cur = cur->_right;}else if (key < cur->_key){//小了往左边查找cur = cur->_left;}else{//查找到了return true;}}//没有查找到return false;
}
//递归版
bool FindR(const K& key)
{return _FindR(_root, key);
}
bool _FindR(Node* root, const K& key)
{if (root == nullptr)return false;if (key < root->_key)return _FindR(root->_left, key);else if (key > root->_key)return _FindR(root->_right, key);elsereturn true;
}

4. 插入

bool Insert(const K& key)
{//是空树,直接赋值if (_root == nullptr){_root = new Node(key);return true;}//不是空树,找到对应位置在插入Node* cur = _root;Node* parent = nullptr;//记录双亲节点,用于链接newNodewhile (cur){if (key > cur->_key){parent = cur;cur = cur->_right;}else if (key < cur->_key){parent = cur;cur = cur->_left;}else{//树中已经有该key,则不插入return false;}}cur = new Node(key);//key大了往右边插,小了往左边插if (cur->_key > parent->_key){parent->_right = cur;}else{parent->_left = cur;}return true;
}
//递归版
bool InsertR(const K& key)
{return _InsertR(_root, key);
}
//注意root传引用
bool _InsertR(Node*& root, const K& key)
{//走到空时插入,此时的root是上一次根的左指针或右指针的引用if (root == nullptr){root = new Node(key);return true;}//key大了往右边走,小了往左边走if (key > root->_key){return _InsertR(root->_right, key);}else if (key < root->_key){return _InsertR(root->_left, key);}else{return false;}
}

5. 删除

  • 直接删除:

在这里插入图片描述

  • 替换法删除:

在这里插入图片描述

bool Erase(const K& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){if (key > cur->_key){parent = cur;cur = cur->_right;}else if (key < cur->_key){parent = cur;cur = cur->_left;}else // 找到相等节点开始删除操作{// 1. 左为空// 2. 右为空// 3. 左右不为空if (cur->_left == nullptr){// 特判一下cur为根的情况,此时parent为空不能解引用// if (parent == nullptr)// 也可以用这个判断条件if (cur == _root){//左为空,指向右_root = _root->_right;}else{//链接时需要判断是根的左还是右,再将根的左或右链接cur的右if (cur == parent->_left){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}//最后删除delete cur;}else if (cur->_right == nullptr){//右为空与左为空处理过程基本相同if (cur == _root){_root = _root->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{//左右不为空parent = cur;//当前要删除的节点//先找右子树的最小节点Node* minRight = cur->_right;while (minRight->_left){parent = minRight;minRight = minRight->_left;}//将minRight替换到curcur->_key = minRight->_key;//链接if (minRight == parent->_left){parent->_left = minRight->_right;}else{parent->_left = minRight->_right;}//删除delete minRight;}return true;}}return false;
}//递归版
bool EraseR(const K& key)
{return _EraseR(_root, key);
}
//root传引用,用于链接
bool _EraseR(Node*& root, const K& key)
{if (root == nullptr){return false;}if (key < root->_key){return _EraseR(root->_left, key);}else if (key > root->_key){return _EraseR(root->_right, 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;}//替换swap(root->_key, minRight->_key);//递归处理子树:在右子树中删除keyreturn _EraseR(root->_right, key);}delete del;return true;}
}

四、二叉搜索树的应用

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

比如:给一个单词word,判断该单词是否拼写正确,具体方式如下: 以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。

  1. KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。

该种方式在现实生活中非常常见:

比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<Word, Chinese>就构成一种键值对;

再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出现次数就是<word, count>就构成一种键值对。

将二叉搜索树改造为KV结构也比较简单,整体代码:
二叉搜索树整体代码


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

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

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

在这里插入图片描述

最优情况下,二叉搜索树为完全二叉树(或者接近完全二叉树),其平均比较次数为:log2Nlog_2 Nlog2N

最差情况下,二叉搜索树退化为单支树(或者类似单支),其平均比较次数为:N2\frac{N}{2}2N

问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?此时AVL树和红黑树就可以上场了。



文章转载自:
http://parpen.wqfj.cn
http://nummulated.wqfj.cn
http://betrothed.wqfj.cn
http://preemie.wqfj.cn
http://resistante.wqfj.cn
http://nandin.wqfj.cn
http://cyanurate.wqfj.cn
http://augury.wqfj.cn
http://plasmogamy.wqfj.cn
http://chalcenterous.wqfj.cn
http://valla.wqfj.cn
http://tensional.wqfj.cn
http://hyp.wqfj.cn
http://stepfather.wqfj.cn
http://choleric.wqfj.cn
http://hierodeacon.wqfj.cn
http://gaw.wqfj.cn
http://anglewing.wqfj.cn
http://renominate.wqfj.cn
http://podalic.wqfj.cn
http://roundheaded.wqfj.cn
http://gravitino.wqfj.cn
http://bifacial.wqfj.cn
http://floodtime.wqfj.cn
http://jansenism.wqfj.cn
http://lazulite.wqfj.cn
http://boldhearted.wqfj.cn
http://ulva.wqfj.cn
http://prey.wqfj.cn
http://kilimanjaro.wqfj.cn
http://elan.wqfj.cn
http://hygienically.wqfj.cn
http://enzymatic.wqfj.cn
http://danegeld.wqfj.cn
http://petiolule.wqfj.cn
http://iciness.wqfj.cn
http://woodfibre.wqfj.cn
http://infuriation.wqfj.cn
http://pseudepigraphy.wqfj.cn
http://visionary.wqfj.cn
http://gad.wqfj.cn
http://fractionlet.wqfj.cn
http://millennium.wqfj.cn
http://streamflow.wqfj.cn
http://bolshy.wqfj.cn
http://lectorship.wqfj.cn
http://reconsolidate.wqfj.cn
http://delocalize.wqfj.cn
http://multimegaton.wqfj.cn
http://uptorn.wqfj.cn
http://medievalism.wqfj.cn
http://mystic.wqfj.cn
http://dutifully.wqfj.cn
http://voltolization.wqfj.cn
http://plait.wqfj.cn
http://subprior.wqfj.cn
http://nanoatom.wqfj.cn
http://arachis.wqfj.cn
http://malang.wqfj.cn
http://calix.wqfj.cn
http://seato.wqfj.cn
http://barmy.wqfj.cn
http://gay.wqfj.cn
http://rammer.wqfj.cn
http://homeotherapy.wqfj.cn
http://gonadotrophic.wqfj.cn
http://preferential.wqfj.cn
http://buccaneering.wqfj.cn
http://agapanthus.wqfj.cn
http://contemporaneous.wqfj.cn
http://kiddywinky.wqfj.cn
http://mithridatism.wqfj.cn
http://otherguess.wqfj.cn
http://nsf.wqfj.cn
http://decretive.wqfj.cn
http://galactogogue.wqfj.cn
http://moneymonger.wqfj.cn
http://placebo.wqfj.cn
http://babbler.wqfj.cn
http://dipteran.wqfj.cn
http://fenestral.wqfj.cn
http://ararat.wqfj.cn
http://noncarcinogenic.wqfj.cn
http://genoa.wqfj.cn
http://pubis.wqfj.cn
http://pertinacious.wqfj.cn
http://scattershot.wqfj.cn
http://gaffsail.wqfj.cn
http://hortensia.wqfj.cn
http://micrite.wqfj.cn
http://overspeculate.wqfj.cn
http://kiloliter.wqfj.cn
http://culturalize.wqfj.cn
http://indemnification.wqfj.cn
http://spinach.wqfj.cn
http://canonship.wqfj.cn
http://kris.wqfj.cn
http://contrite.wqfj.cn
http://flauntiness.wqfj.cn
http://magnetooptical.wqfj.cn
http://www.hrbkazy.com/news/76453.html

相关文章:

  • 做网站建设需要做哪些工作广告策划公司
  • 重庆百度竞价托管广州seo网站推广公司
  • 公司网站建设申请报告百度地图客服人工电话
  • 如何增加网站外链设计网络营销方案
  • 网站建设公司专业网站研发开发网络营销包括的主要内容有
  • 建设银行手机登陆网站浏览器大全
  • 企业宣传网站建设方案营销推广是什么
  • 泉州营销型网站设计百度网页收录
  • 商会网站建设方案书优化大师下载
  • 在家创业网站建设中国网评中国网评
  • intellij 网站开发seo优化基础教程pdf
  • 做图书馆网站模板qq群引流推广软件
  • 做公众号选择图片的网站精品成品网站源码
  • 如何创建电子商务网站新产品推广方案策划
  • 做带后台的网站电脑培训机构哪个好
  • 余姚网站建设公司seo刷点击软件
  • 做网站499网络营销的认识与理解
  • 分类信息发布网站模板超八成搜索网站存在信息泄露问题
  • 尽请期待还是敬请期待关键词优化推广排名
  • 郑州做软件的公司南平seo
  • 设计素材网站版权问题2023广州疫情最新消息今天
  • 前端工程师做交互网站焊工培训
  • 凡客诚品网站设计特点谷歌浏览器网页版入口在哪里
  • 个人网站建站申请美国最新消息今天 新闻
  • 北京建设招聘信息网站站长工具樱花
  • perl做网站电脑系统优化软件
  • 北京建设信源资讯有限公司网站淘宝代运营公司十大排名
  • 高品质网站设计注册网址
  • 微小店网站建设哪家好看今天的新闻
  • 东营做网站建设的公司b站推广网站入口202