96SEO 2026-02-20 05:49 13
。

若它的右子树不为空#xff0c;则右子树上所有结点的值都大于根结…二叉搜索树的概念
二叉搜索树又称为二叉排序树它或者是一棵空树或者是具有以下性质的二叉树
若它的左子树不为空则左子树上所有结点的值都小于根结点的值。
若它的右子树不为空则右子树上所有结点的值都大于根结点的值。
它的左右子树也分别是二叉搜索树。
由于二叉搜索树中每个结点左子树上所有结点的值都小于该结点的值右子树上所有结点的值都大于该结点的值因此对二叉搜索树进行中序遍历后得到的是升序序列也就不难理解了。
a、从根开始比较查找比根大则往右边走查找比根小则往左边走查找。
看起来有待删除节点有4中情况实际情况a可以与情况b或者c合并起来因此真正的删除过程如下
情况b删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点–直接删除
情况c删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点–直接删除
情况d在被删除的结点的右子树中寻找中序下的第一个结点(关键码最小)用它的值填补到被删除节点中再来处理该结点的删除问题–替换法删除
结点类当中包含三个成员变量结点值、左指针、右指针。
结点类当中只需实现一个构造函数即可用于构造指定结点值的结点。
default;//指定强制生成默认构造//默认构造BSTree();//拷贝构造BSTree(const
t);//析构函数~BSTree();//插入key值bool
Copy(root-_left);newRoot-_right
}赋值运算符重载函数的现代写法非常精辟函数在接收右值时并没有使用引用进行接收因为这样可以间接调用BSTree的拷贝构造函数完成拷贝构造。
我们只需将这个拷贝构造出来的对象的二叉搜索树与this对象的二叉搜索树进行交换就相当于完成了赋值操作而拷贝构造出来的对象t会在该赋值运算符重载函数调用结束时自动析构。
析构函数完成对象中二叉搜索树结点的释放注意释放时采用后序释放当二叉搜索树中的结点被释放完后将对象当中指向二叉搜索树的指针及时置空即可。
{return;}//后序遍历析构Destroy(root-_left);Destroy(root-_right);delete
根据二叉搜索树的特性我们在二叉搜索树当中查找指定值的结点的方式如下
若树为空树则查找失败返回nullptr。
若key值小于当前结点的值则应该在该结点的左子树当中进行查找。
若key值大于当前结点的值则应该在该结点的右子树当中进行查找。
若key值等于当前结点的值则查找成功返回对应结点的地址。
若待插入结点的值小于根结点的值则需要将结点插入到左子树当中。
若待插入结点的值大于根结点的值则需要将结点插入到右子树当中。
若待插入结点的值等于根结点的值则插入结点失败。
如此进行下去直到找到与待插入结点的值相同的结点判定为插入失败或者最终插入到某叶子结点的左右子树当中即空树当中。
使用非递归方式实现二叉搜索树的插入函数时我们需要定义一个parent指针该指针用于标记待插入结点的父结点。
这样一来当我们找到待插入结点的插入位置时才能很好的将待插入结点与其父结点连接起来。
但是需要注意在连接parent和cur时需要判断应该将cur连接到parent的左边还是右边。
如果_root不为nullptr那么就从根开始遍历找适合的位置Node
parent跟着cur遍历找到合适的位置充当插入的父亲节点Node
这里不知道cur最终走到了parent的左边还是右边所以还要进行判断//
递归实现二叉搜索树的插入操作也是很简单的但是要特别注意的一点就是递归插入函数的子函数接收参数root时必须采用引用接收因为只有这样我们才能将二叉树当中的各个结点连接起来。
二叉搜索树的删除函数是最难实现的若是在二叉树当中没有找到待删除结点则直接返回false表示删除失败即可但若是找到了待删除结点此时就有以下三种情况
待删除结点的左子树为空待删除结点的左右子树均为空包含在内。
待删除结点的右子树为空。
待删除结点的左右子树均不为空。
若待删除结点的左子树为空那么当我们在二叉搜索树当中找到该结点后只需先让其父结点指向该结点的右孩子结点然后再将该结点释放便完成了该结点的删除进行删除操作后仍保持二叉搜索树的特性。
若待删除结点的右子树为空那么当我们在二叉搜索树当中找到该结点后只需先让其父结点指向该结点的左孩子结点然后再将该结点释放便完成了该结点的删除进行删除操作后仍保持二叉搜索树的特性。
若待删除结点的左右子树均不为空那么当我们在二叉搜索树当中找到该结点后可以使用替换法进行删除。
可以将让待删除结点左子树当中值最大的结点或是待删除结点右子树当中值最小的结点代替待删除结点被删除下面都以后者为例然后将待删除结点的值改为代替其被删除的结点的值即可。
而代替待删除结点被删除的结点必然左右子树当中至少有一个为空树因此删除该结点的方法与前面说到的情况一和情况二的方法相同。
注意只能是待删除结点左子树当中值最大的结点或是待删除结点右子树当中值最小的结点代替待删除结点被删除因为只有这样才能使得进行删除操作后的二叉树仍保持二叉搜索树的特性。
1.如果要删除的cur左边是nullptr那么我们就进行判断判断cur在parent的左子树还是右子树//
如果是左子树那么就由parent的left指向cur的右子树如果是右子树就由parent的right指向cur的右子树if
都不为nullptr,替代法用被删除的cur的左子树的最大节点右子树的最大节点替换//
那么左边已经是最小了所以minRight的左子树肯定为空了//
那么可能minRight还有右子树所以需要pinRight来领养if
如果不是比如删除根节点那么就需要将pminRight-_right指向minRight-right(最小值左边一定为NULL。
不需要领养)//minRight是其父结点的右孩子pminRight-_right
若树为空树则结点删除失败返回false。
若所给key值小于树根结点的值则问题变为删除左子树当中值为key的结点。
若所给key值大于树根结点的值则问题变为删除右子树当中值为key的结点。
若所给key值等于树根结点的值则根据根结点左右子树的存在情况不同进行不同的处理。
root;//开始准备删除root谁上层root-_left/_right的引用if
maxleft-_right;}swap(root-_key,
maxleft-_key);//转换在子树去删除//这里不能传maxleftmaxleft是局部变量return
default;//指定强制生成默认构造//默认构造,构造一个空树//构造树的深拷贝BSTree(const
*this;//为了支持连续赋值}//现代写法,接收一个t的拷贝,临时对象,然后进行交换BSTreeK
如果_root不为nullptr那么就从根开始遍历找适合的位置Node
parent跟着cur遍历找到合适的位置充当插入的父亲节点Node
这里不知道cur最终走到了parent的左边还是右边所以还要进行判断//
1.如果要删除的cur左边是nullptr那么我们就进行判断判断cur在parent的左子树还是右子树//
如果是左子树那么就由parent的left指向cur的右子树如果是右子树就由parent的right指向cur的右子树if
都不为nullptr,替代法用被删除的cur的左子树的最大节点右子树的最大节点替换//
那么左边已经是最小了所以minRight的左子树肯定为空了//
那么可能minRight还有右子树所以需要pinRight来领养if
如果不是比如删除根节点那么就需要将pminRight-_right指向minRight-right(最小值左边一定为NULL。
不需要领养)//minRight是其父结点的右孩子pminRight-_right
Copy(root-_left);newRoot-_right
{return;}//后序遍历析构Destroy(root-_left);Destroy(root-_right);delete
root;//开始准备删除root谁上层root-_left/_right的引用if
maxleft-_right;}swap(root-_key,
maxleft-_key);//转换在子树去删除//这里不能传maxleftmaxleft是局部变量return
nullptr)return;_InOrder(root-_left);cout
;_InOrder(root-_right);}private:Node
{t.Insert(e);}t.Erase(7);t.Erase(14);t.Erase(3);t.Erase(8);t.InOrder();
{t.InsertR(e);}t.EraseR(7);t.EraseR(14);t.EraseR(3);t.EraseR(8);t.EraseR(6);t.InOrder();
{t1.InsertR(e);}t1.InOrder();BSTreeint
K模型K模型即只有key作为关键码结构中只需要存储Key即可关键码即为需要搜索到的值。
在二叉搜索树中检索该单词是否存在存在则拼写正确不存在则拼写错误。
KV模型每一个关键码key都有与之对应的值Value即Key,Value的键值对。
该种方式在现实生活中非常常见
比如英汉词典就是英文与中文的对应关系通过英文可以快速找到与其对应的中文英文单词与其对应的中文**word,chinese**就构成一种键值对
再比如统计单词次数统计成功后给定单词就可快速找到其出现的次数**单词与其出现次数就是就构成一种键值对。
**
2、在则查找到的节点中水果对应的次数//BSTreeNodestring,
{ret-_value;}}countTree.InOrder();
插入和删除操作都必须先查找查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树若每个元素查找的概率相等则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数即结点越深则比较次数越多。
但对于同一个关键码集合如果各关键码插入的次序不同可能得到不同结构的二叉搜索树
最优情况下二叉搜索树为完全二叉树(或者接近完全二叉树)其平均比较次数为LogN
最差情况下二叉搜索树退化为单支树(或者类似单支)其平均比较次数为N/2
问题如果退化成单支树二叉搜索树的性能就失去了。
那能否进行改进不论按照什么次序插入关键码二叉搜索树的性能都能达到最优答案就是使用AVL树和红黑树
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback