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

网站做优化需要多少钱在线外链

网站做优化需要多少钱,在线外链,嘉兴企业网站开发,餐饮酒店网站怎么做1 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: 1 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 2 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点…

1 二叉搜索树的概念

⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:

1 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值

2 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值

3 它的左右⼦树也分别为⼆叉搜索树

4 ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义

2 二叉搜索树的性能分析 

最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: logN

最差情况下,⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度为: N

所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为: O(N)

那么这样的效率显然是⽆法满⾜我们需求的,我们后续课程需要继续讲解⼆叉搜索树的变形,平衡⼆叉搜索树AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。

另外需要说明的是,⼆分查找也可以实现 O(logN) 2 级别的查找效率,但是⼆分查找有两⼤缺陷:

1. 需要存储在⽀持下标随机访问的结构中,并且有序。

2. 插⼊和删除数据效率很低,因为存储在下标随机访问的结构中,插⼊和删除数据⼀般需要挪动数据。

这⾥也就体现出了平衡⼆叉搜索树的价值

 3 二叉搜索树的插入

 插⼊的具体过程如下:

1. 树为空,则直接新增结点,赋值给root指针

2. 树不空,按⼆叉搜索树性质,插⼊值⽐当前结点⼤往右⾛,插⼊值⽐当前结点⼩往左⾛,找到空位 置,插⼊新结点。

3. 如果⽀持插⼊相等的值,插⼊值跟当前结点相等的值可以往右⾛,也可以往左⾛,找到空位置,插⼊新结点。(要注意的是要保持逻辑⼀致性,插⼊相等的值不要⼀会往右⾛,⼀会往左⾛)

        代码实现:

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 (key > parent->_key){parent->_right = cur;}else{parent->_left = cur;}return true;
}

4 二叉搜索树的查找 

1.从根开始⽐较,查找x,x⽐根的值⼤则往右边⾛查找,x⽐根值⼩则往左边⾛查找。

2. 最多查找⾼度次,⾛到到空,还没找到,这个值不存在。

3. 如果不⽀持插⼊相等的值,找到x即可返回

4. 如果⽀持插⼊相等的值,意味着有多个x存在,⼀般要求查找中序的第⼀个x。如下图,查找3,要 找到1的右孩⼦的那个3返回

        代码实现:

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

5 二叉搜索树的删除 

 ⾸先查找元素是否在⼆叉搜索树中,如果不存在,则返回false。

如果查找元素存在则分以下四种情况分别处理:(假设要删除的结点为N)

1. 要删除结点N左右孩⼦均为空

2. 要删除的结点N左孩⼦位空,右孩⼦结点不为空

3. 要删除的结点N右孩⼦位空,左孩⼦结点不为空

4. 要删除的结点N左右孩⼦结点均不为空

对应以上四种情况的解决⽅案:

1. 把N结点的⽗亲对应孩⼦指针指向空,直接删除N结点(情况1可以当成2或者3处理,效果是⼀样 的)

2. 把N结点的⽗亲对应孩⼦指针指向N的右孩⼦,直接删除N结点

3. 把N结点的⽗亲对应孩⼦指针指向N的左孩⼦,直接删除N结点

4. ⽆法直接删除N结点,因为N的两个孩⼦⽆处安放,只能⽤替换法删除。找N左⼦树的值最⼤结点 R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的 位置,都满⾜⼆叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转⽽变成删除R结 点,R结点符合情况2或情况3,可以直接删除。

代码实现:

bool Erase(const K& key)
{Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}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 = _root->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{Node* replaceParent = cur;Node* replace = cur->_right;while (replace->_left){replaceParent = replace;replace = replace->_left;}swap(cur->_key, replace->_key);if (replaceParent->_left == replace)replaceParent->_left = replace->_right;elsereplaceParent->_right = replace->_right;delete replace;}return true;}}return false;
}

 二叉树的遍历

那么上面写完了我们总得是要测试一下的,那么为了输出的结果好看,二叉搜索树的中序遍历就可以将输出的结果按照升序的样式打印出来。

        代码实现: 

void InOrder()
{_InOrder(_root);cout << endl;
}void _InOrder(Node* root)
{if (root == nullptr){return;}_InOrder(root->_left);cout << root->_key << " " ;_InOrder(root->_right);

在这里是因为,在外部调用InOrder的话,root并不作为public对象对外可以进行访问的,因此单纯的写一个InOrder函数达不到打印的效果,但是可以在创建一个无参的InOrder来进行调用,这样内部的函数进行调用就不会出现那种情况了,那么就可以达到我们想要的效果了。

 到这里关于二叉搜索树的介绍就到这里了,感谢你的观看!

http://www.dtcms.com/wzjs/131672.html

相关文章:

  • 网站建设售后完善产品怎么进行推广
  • 网站建设开发案例网站流量分析
  • 怎样做二维码链接到网站上百度投票人气排行榜入口
  • 乒乓球网站建设目标小程序开发教程
  • 网站公安备案 工信备案本周新闻热点
  • 无锡营销型网站制作东莞企业推广网站制作
  • 网络运营平台济南网站优化排名推广
  • 江西省建设厅教育网站上查询郑州网站运营
  • 网站建设优化安徽百度推广投诉中心
  • 企业商标图片大全班级优化大师是干什么用的
  • 做网站要招什么样的程序员电脑培训网上免费课程
  • b站做视频哪个网站收入怎么做网页
  • 深圳有哪些物流公司windows优化大师绿色版
  • 伤豆丁文库网站开发淘宝优秀软文范例100字
  • 如何开发cms网站网站排名优化专业定制
  • qq网站官网网站服务器一年的费用
  • 建设厅网站上保存键看不见网页模板建站系统
  • 纵横互联 武汉网站建设网络营销的手段包括
  • 大兴网站建设报价广州市口碑seo推广
  • 网站页面设计合同seo百度推广
  • 注册建筑公司宁波seo资源
  • 做英文网站公司百度下载应用
  • 公司做网站需要什么资质优化大师是什么意思
  • 有哪些做产品产业链分析的网站服装营销方式和手段
  • 过年做啥网站能致富百度推销广告一年多少钱
  • 做照片书网站好百度网站怎么做
  • 网站设计标题中国互联网公司排名
  • b2b b2c网站的介绍太原seo排名
  • 电子商务系统网站设计客服外包平台
  • 淘宝客网站必须备案吗湖南百度推广