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

宁波建设银行网站首页四川企业seo推广

宁波建设银行网站首页,四川企业seo推广,网络工程师网课,旅行社网站建设方案书一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

一、概念

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

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

在这里插入图片描述


二、二叉搜索树的操作

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.dinnco.com/news/60795.html

相关文章:

  • 公众号吸粉的方法seo优化6个实用技巧
  • 珠海网站建设设计西安网络推广seo0515
  • 国外毕业设计网站搜索引擎优化要考虑哪些方面
  • 淘宝请人做网站被骗国内新闻热点事件
  • 免费网页空间教程推广优化网站排名
  • 将自己做的网站用电脑发到网上百度seo优化排名
  • 网站圣诞问候特效谷歌收录查询
  • 十堰网站设计0719web企业宣传标语
  • 成品网站建设咨询百度搜索关键词排名查询
  • 一个可以做网站镇江seo快速排名
  • 网站建设科技公司外部环境分析优化水平
  • 杭州做网站多少钱网站关键词查询
  • 哪些网站做财金的好合肥关键词优化平台
  • wordpress地址和站点地址有什么用网络营销学校
  • wordpress菜单栏不显示五年级上册语文优化设计答案
  • 太原cms模板建站久久seo正规吗
  • 南川网站建设宁波seo关键词优化
  • 常州网站建设设计个人网站网页首页
  • 网站编辑的工作职能有哪些电商运营公司排名
  • 网站建设策划公司地址肇庆seo
  • 特效素材免费网站淘宝美工培训
  • 滕州盛扬网络公司网站建设推广太原百度推广排名优化
  • 帮人做网站怎么收费石家庄百度seo
  • 广东省建设安全监督站的网站重大新闻事件
  • c c也能干大事网站开发网站关键词搜索排名
  • wordpress mingle网络优化有前途吗
  • 可信网站是什么意思西安百度推广排名
  • 手机端web模板无锡百度快照优化排名
  • 网站促销活动策划常见的网站推广方式有哪些
  • 汽车之家二手车之家长沙seo外包优化