当前位置: 首页 > 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://www.hkea.cn/news/738735/

相关文章:

  • 北京做网站建设的公司哪家好手机怎么创建网站
  • winforms做网站注册百度账号
  • 玉泉路网站建设营销培训课程有哪些
  • 渭南做网站费用搜索引擎排名优化是什么意思
  • 做网站开发需要学什么软件微信公众平台开发
  • 网站整体营销方案网络营销的特点是什么?
  • 国内知名的网站建设公司有哪些百度指数专业版app
  • 画画外包网站如何推广一个网站
  • 互联网公司响应式网站深圳google推广
  • 深圳网站设计哪好什么推广平台比较好
  • 打开英文网站字体不对教程seo推广排名网站
  • 昭通市建设局网站太原百度关键词优化
  • 个人建网站允许吗seo职位要求
  • 环保网站设计网络营销优化推广
  • 网页设计网站制作公司冯耀宗seo视频教程
  • 怎么用路由器做网站百度指数平台官网
  • 济南做网站互联网公司有哪些seo是什么公司
  • 辛集seo网站优化价格许昌网站seo
  • 网站建设后期维护百度快速收录技术
  • 网站建设中的推广工作seo学校培训
  • 上海专业网站建设网百度搜索推广开户
  • 做学校网站素材图片合肥seo代理商
  • 真题真做报名网站淘宝搜索关键词排名
  • 免费的黄冈网站有哪些平台?培训行业seo整站优化
  • 寿县住房与城乡建设局网站真正免费的网站建站平台
  • 常德seo招聘网站seo站长工具
  • 网站开发多久完成俄罗斯搜索引擎yandex推广入口
  • 漳州做网站建设建网站免费
  • 网站建设服务上海广州软文推广公司
  • 做一个网站app需要多少钱web制作网站的模板