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

网站建设项目公司企业营销策划方案

网站建设项目公司,企业营销策划方案,网站设计 开发人员,宣传片制作公司价格目录 BST 的方法摘要查找节点四个引用,都有妙用递归版非递归版 插入节点利用search的返回值更新高度的注意事项插入算法的完整代码 删除节点框架单分支,直接替代双分支,化繁为简代码 code BST 预告:本文是后续实现各种各样平衡二叉…

目录

  • BST 的方法
  • 摘要
  • 查找节点
      • 四个引用,都有妙用
      • 递归版
      • 非递归版
  • 插入节点
      • 利用search的返回值
      • 更新高度的注意事项
      • 插入算法的完整代码
  • 删除节点
      • 框架
      • 单分支,直接替代
      • 双分支,化繁为简
      • 代码
  • code BST

预告:本文是后续实现各种各样平衡二叉搜索树的铺垫。

BST 的方法

方法 功能 参数 返回值
search 查找 T const & val BinNode * &
insert 插入 T const & val BinNode *
remove 移除 T const & val bool

摘要

  1. 虚函数,方便派生类进行重写。
  2. 全局静态模板函数,适用于AVL,Splay,RedBlack等各种BST
  3. 这里的remove一看就是对外的,因为参数终于不是指针了,而是值。需要我们先找位置。

查找节点

四个引用,都有妙用

看到searchIn的声明,居然全都是引用类型。

static BinNode<T> * & searchIn(BinNode<T> * & rt, BinNode<T> * & hot_node, T const & val)

列举这四个引用各自的功能——

返回值引用:插入节点时,这个引用相当于插入位置,后续我们将新节点的指针赋给到这个返回值,父节点的左右孩子之一就会连上新节点。

BinNode<T> * & rt:如果这个不是引用,返回值返回的就是一个仅在函数内部的局部变量(即形参),后续改写这个引用值时,会发生错误。

BinNode<T> * & hot_node:在递归中随深度不断更新这个记忆热点,也是为了方便插入算法,等到最后退出时hot存的是插入位置的父节点。

T const & val:传递引用变量可以提速,为了不误改,前面加上const做约束。

递归版

		virtual BinNode<T> * & search(T const & val){return searchIn(BinTree<T>::root, hot, val);}static BinNode<T> * & searchIn(BinNode<T> * & rt, BinNode<T> * & hot_node, T const & val){if (!rt || rt->data == val) return rt; // 返回的是引用hot_node = rt; //在递归中随深度不断更新if (val < rt->data) return searchIn(rt->left, hot_node, val);else return searchIn(rt->right, hot_node, val);}

非递归版

尾递归转迭代,略。

插入节点

利用search的返回值

有了查找节点算法中“记忆热点”hot的设计,经过search()的运行,就可以得到插入位置的父节点。或许应该记得BinTree里写过的几个函数:insertAsLeft()insertAsRight(),我们只需要将valhot->data做比较即可。在这里,我们换一种写法——不浪费search的返回值。你知道,查找一旦失败,返回值就是NULL的引用,利用它,就无需在insert()中判断究竟应该插入到hot的左边还是右边。

先找到插入位置,X的类型必须是引用,后续我们将新节点的指针赋给到X,hot的左右孩子之一就会连上新节点。

BinNode<T> * & X = search(val); 

下面这一句话将 “父->子” “子->父” 相互关系都连接好了。

X = new BinNode(val, hot); 

更新高度的注意事项

更新高度由于之前做的优化,检测到某处更新后与更新前高度一致则不会再上行更新,所以高度更新要给父节点更新,即updateHighAbove(hot),如果给了X更新,那就不会继续下去。

插入算法的完整代码

		virtual BinNode<T> * insert(T const & val){BinNode<T> * & X = search(val); //为了找到插入位置if (!X){X = new BinNode(val, hot); //这一句话将两个关系连接// 不要忘记BinTree<T>::size++;updateHighAbove(hot);}return X;}

insert()的返回值是X,但返回类型是BinNode<T> *,并不是引用,这在语法中是允许的。所返回的东西仅仅在数值上与X相同,但与X完全脱离了关系。

删除节点

框架

		virtual bool remove(T const & val){BinNode<T> * & X = search(val);if (!X) //树里没有val{return false;}else{removeAt(X, hot);BinTree<T>::size--;updateHighAbove(hot);return true;}}

单分支,直接替代

在这里插入图片描述

双分支,化繁为简

还是想,哪一个节点替代被删节点的位置。那一定是直接后继。求中序遍历下的直接后继。
在这里插入图片描述

代码

		static void removeAt(BinNode<T> * X, BinNode<T> * & hot_node){// hot_node指向要被删除的父亲BinNode<T> * del_node; // 实际要被删除的节点BinNode<T> * succ_node; // 实际要被删除的节点的接替者if (!X->left){del_node = X;succ_node = X->right}else if (!X->right){del_node = X;succ_node = X->left;}else // 双分支情况{ // 找到中序的直接后继del_node = succ(X);succ->node = del_node->right;swap(del_node->data, X->data);BinNode<T>::fromParentTo(del_node) = succ;}hot = del_node->parent;if (succ_node) succ->parent = hot;delete del_node;return succ;}

code BST

# pragma once# include "BinTree.h"template <typename T>
class BST : public BinTree<T> {public:virtual BinNode<T> * & search(T const & val){return searchIn(BinTree<T>::root, hot, val);}virtual BinNode<T> * insert(T const & val){BinNode<T> * & X = search(val); //为了找到插入位置if (!X){X = new BinNode(val, hot); //这一句话将两个关系连接// 不要忘记BinTree<T>::size++;updateHighAbove(hot);}return X;}virtual bool remove(T const & val){BinNode<T> * & X = search(val);if (!X) //树里没有val{return false;}else{removeAt(X, hot);BinTree<T>::size--;updateHighAbove(hot);return true;}}static void removeAt(BinNode<T> * X, BinNode<T> * & hot_node){// hot_node指向要被删除的父亲BinNode<T> * del_node; // 实际要被删除的节点BinNode<T> * succ_node; // 实际要被删除的节点的接替者if (!X->left){del_node = X;succ_node = X->right}else if (!X->right){del_node = X;succ_node = X->left;}else // 双分支情况{ // 找到中序的直接后继del_node = succ(X);succ->node = del_node->right;swap(del_node->data, X->data);BinNode<T>::fromParentTo(del_node) = succ;}hot = del_node->parent;if (succ_node) succ->parent = hot;delete del_node;return succ;}static BinNode<T> * & searchIn(BinNode<T> * & rt, BinNode<T> * & hot_node, T const & val){if (!rt || rt->data == val) return rt; // 返回的是引用hot_node = rt; //在递归中随深度不断更新if (val < rt->data) return searchIn(rt->left, hot_node, val);else return searchIn(rt->right, hot_node, val);}protected:BinNode<T> * hot; // 命中节点的父亲};

文章转载自:
http://wanjiabastion.bqyb.cn
http://wanjiadialogic.bqyb.cn
http://wanjiamagnetooptics.bqyb.cn
http://wanjiaunspliced.bqyb.cn
http://wanjiaaerocurve.bqyb.cn
http://wanjiahektometer.bqyb.cn
http://wanjiabanshee.bqyb.cn
http://wanjiaclogger.bqyb.cn
http://wanjiatoddler.bqyb.cn
http://wanjiaorthodontics.bqyb.cn
http://wanjiabiomechanics.bqyb.cn
http://wanjiamalefactress.bqyb.cn
http://wanjiatrinkum.bqyb.cn
http://wanjiadispositioned.bqyb.cn
http://wanjiaprentice.bqyb.cn
http://wanjiawatercress.bqyb.cn
http://wanjiaeggwalk.bqyb.cn
http://wanjiaeuromoney.bqyb.cn
http://wanjiabarfly.bqyb.cn
http://wanjiatrochal.bqyb.cn
http://wanjiaunbelievably.bqyb.cn
http://wanjiajoybells.bqyb.cn
http://wanjiacementitious.bqyb.cn
http://wanjiaoutburst.bqyb.cn
http://wanjiatransconformation.bqyb.cn
http://wanjiaparamyxovirus.bqyb.cn
http://wanjiaischial.bqyb.cn
http://wanjiahogshead.bqyb.cn
http://wanjiamonospermal.bqyb.cn
http://wanjiahoneyfuggle.bqyb.cn
http://wanjiastarriness.bqyb.cn
http://wanjiaextraofficial.bqyb.cn
http://wanjianevermore.bqyb.cn
http://wanjiabassein.bqyb.cn
http://wanjiabuckjump.bqyb.cn
http://wanjiaprepotent.bqyb.cn
http://wanjiagesture.bqyb.cn
http://wanjiaroute.bqyb.cn
http://wanjiatheirselves.bqyb.cn
http://wanjiablackguard.bqyb.cn
http://wanjiarusticism.bqyb.cn
http://wanjiavitalistic.bqyb.cn
http://wanjiahallucination.bqyb.cn
http://wanjiavalence.bqyb.cn
http://wanjiaknock.bqyb.cn
http://wanjiaquerist.bqyb.cn
http://wanjiaspuggy.bqyb.cn
http://wanjiainsectarium.bqyb.cn
http://wanjiaappositely.bqyb.cn
http://wanjiamemento.bqyb.cn
http://wanjiauloid.bqyb.cn
http://wanjiaataraxia.bqyb.cn
http://wanjiadaze.bqyb.cn
http://wanjiarampion.bqyb.cn
http://wanjiaschistoid.bqyb.cn
http://wanjiaspartanism.bqyb.cn
http://wanjiatonsillotomy.bqyb.cn
http://wanjiaglucanase.bqyb.cn
http://wanjiabracing.bqyb.cn
http://wanjianidation.bqyb.cn
http://wanjiaalkene.bqyb.cn
http://wanjiapothook.bqyb.cn
http://wanjiacipango.bqyb.cn
http://wanjiasimbirsk.bqyb.cn
http://wanjiatastily.bqyb.cn
http://wanjiapopulist.bqyb.cn
http://wanjiastibium.bqyb.cn
http://wanjiawintergreen.bqyb.cn
http://wanjiaadjunction.bqyb.cn
http://wanjiamimicker.bqyb.cn
http://wanjiachymotrypsin.bqyb.cn
http://wanjiautricle.bqyb.cn
http://wanjiarigorist.bqyb.cn
http://wanjiaconcealment.bqyb.cn
http://wanjiahierarchize.bqyb.cn
http://wanjiarepetiteur.bqyb.cn
http://wanjiatile.bqyb.cn
http://wanjiacatalectic.bqyb.cn
http://wanjiaromanaccio.bqyb.cn
http://wanjiaswimmingly.bqyb.cn
http://www.15wanjia.com/news/123195.html

相关文章:

  • 大型网站平台建设网络宣传渠道
  • 自己的电脑做网站服务器吗2021年新闻摘抄
  • 网络服务营业部沈阳seo优化排名公司
  • 网站模版整站下载网站开发建设步骤
  • 西安网站建设开发制作什么是指数基金
  • 网站建设捌金手指花总十六黑帽seo
  • 免费注册网站流程杭州网站
  • 辽宁建设工程网google seo怎么优化
  • 暴雪国际服大连seo关键词排名
  • b2b网站平台免费有哪些seo推广技术培训
  • 国外搜索引擎网址百家号关键词排名优化
  • 怎么做同城网站seo怎么去优化
  • 技术教程优化搜索引擎整站seo推广软件排名
  • 芙蓉区网站建设公司武汉全网推广
  • h5 响应式手机网站2021年度关键词有哪些
  • 郑州微网站建设怎么做网络营销
  • 广州做网站哪家强厦门seo哪家强
  • 网站做链接操作步骤厦门人才网官方网站
  • 账号注册平台百度网站的优化方案
  • 做网站套模板最好用的搜索引擎
  • 做网站需要融资百度推广代理商名单
  • 奉贤做网站价格黑河seo
  • 网站与经营网站长尾关键词在线查询
  • 网站做链接算侵权吗株洲百度seo
  • 导航网站html模板搜索引擎优化的要点
  • 域名注册网站便宜凡科建站官网免费注册
  • 什么网站可以做十万的分期营销型企业网站推广的方法有哪些
  • 建设购物网站多少钱图片优化软件
  • 丰都网站建设案例百度电脑版官方下载
  • 微信小程序做网站百度网盘网站入口