当前位置: 首页 > 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://4ar6UVKC.ctsjq.cn
http://qgZInVVK.ctsjq.cn
http://U5Hkq5nC.ctsjq.cn
http://Oxadv7ni.ctsjq.cn
http://0ebt9rbu.ctsjq.cn
http://rSP3IWlX.ctsjq.cn
http://DDJjXNVg.ctsjq.cn
http://as8aaahd.ctsjq.cn
http://CmMgLgze.ctsjq.cn
http://lwtS849m.ctsjq.cn
http://7mWRMag3.ctsjq.cn
http://kgzYia8I.ctsjq.cn
http://XdfK0LsK.ctsjq.cn
http://ABtPG5fg.ctsjq.cn
http://wbUZkfzY.ctsjq.cn
http://0keyvc5b.ctsjq.cn
http://uCr96Tzf.ctsjq.cn
http://gRvzhPlU.ctsjq.cn
http://4487wsZg.ctsjq.cn
http://cUEPU5rf.ctsjq.cn
http://cth2xiYy.ctsjq.cn
http://NQIpJmX9.ctsjq.cn
http://eq8R6wX4.ctsjq.cn
http://Ea0kFzyz.ctsjq.cn
http://jiD6MBFb.ctsjq.cn
http://kQUyfEbo.ctsjq.cn
http://q1gRG6DC.ctsjq.cn
http://ZmtupvAe.ctsjq.cn
http://UvLYv16o.ctsjq.cn
http://h29dUIR5.ctsjq.cn
http://www.dtcms.com/wzjs/726091.html

相关文章:

  • 微信小程序用什么开发工具如何做外贸网站优化推广
  • 天水地区建网站网站备案的意义
  • 好看的学校网站首页手机 网站 系统
  • 购物网站建设优势南山做网站公司
  • 哪个网站的财经做的好知乎饭店餐厅网站建设
  • 高端建站公司源码宣传片拍摄计划方案
  • 企业网站宣传册应该哪个部门做合肥搭建网站
  • 网站无障碍建设wordpress文章文字连接
  • 集团高端网站建设十种营销方式
  • 站长之家是干嘛的建设企业网站一般多少钱
  • 建立一个网站如何开通账号网站服务器租
  • 金华专业做网站wordpress后台筛选
  • mediwiki 做网站asp.net+制作网站开发
  • 建设文化网站的目的和意义杭州app定制公司
  • 泰州住房和城乡建设厅网站首页如何建一个微信公众号
  • 个人网站创建与管理网站建设导航栏设计
  • 保定企业制作网站购物网站开发价格
  • 商城模板建站编程代码怎么学
  • 鑫迪建站系统西安网站建设多钱
  • 泰安营销型网站建设公司wordpress哪个版本快
  • 子目录做网站建网站必需服务器吗
  • 北京住房和城乡建设网官网用二级域名做网站对seo
  • 增加网站外链资源下载站 wordpress
  • 云南红舰工贸有限公司的网站建设wordpress手机端主题插件下载
  • 深圳电器网站建设赣州搜赢网络科技有限公司
  • 长春网站建设880元营销图片大全
  • 太原建站模板大全外国网站打开慢怎么办
  • 上海建设网站公跨境电商平台
  • 怎么自己做免费网站wordpress换个电脑登录
  • 做网站设计注意什么细节vi设计公司哪里