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

办公用品网站建设市场定位东莞推广

办公用品网站建设市场定位,东莞推广,微分销系统哪家比较好,夏邑网站建设文章目录1.二叉搜索树基本操作二叉搜索树的效率分析2. C实现1.二叉搜索树基本操作 二叉排序树是具有下列特性的二叉树: 若左子树非空,则左子树上所有结点的值均小于根结点的值。若右子树非空,则右子树上所有结点的值均大于根结点的值。左、…

文章目录

  • 1.二叉搜索树基本操作
    • 二叉搜索树的效率分析
  • 2. C++实现

1.二叉搜索树基本操作

二叉排序树是具有下列特性的二叉树:

  1. 若左子树非空,则左子树上所有结点的值均小于根结点的值。
  2. 若右子树非空,则右子树上所有结点的值均大于根结点的值。
  3. 左、右子树也分别是一棵二叉排序树

根据二叉排序树的定义,左子树结点值< 根结点值< 右子树结点值。
所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。

二叉排序树的搜索

  1. 从根结点开始,沿某个分支逐层向下比较的过程。
  2. 若二叉排序树非空,先将给定值与根结点的关键字比较,若相等,则查找成功
  3. 若不等,如果小于根结点的关键字,则在根结点的左子树上查找,否则在根结点的右子树上查找。

这个过程可以通过递归或者非递归实现实现

二叉排序树的插入

  1. 若原二叉排序树为空,则直接插入结点
  2. 若关键字k小于根结点值,则插入到左子树,若关键字k大于根结点值,则插入到右子树。

插入的结点一定是一个新添加的叶结点,且是查找失败时的查找路径上访问的最后一个结点的左孩子或右孩子.

二叉排序树的删除

在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失。删除操作的实现过程按3种情况来处理

  1. 若被删除结点z是叶结点,则直接删除,不会破坏二叉排序树的性质

  2. 若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z的位置

  3. 若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。可以使用递归解决这个问题。

    直接后继:节点右子树中最左节点(右子树最小节点)

    删除流程图:具体看代码流程
    在这里插入图片描述

二叉搜索树的效率分析

二叉排序树的查找效率,主要取决于树的高度。

  1. 若二叉排序树的左、右子树的高度之差的绝对值不超过1(这样的二叉排序树称为平衡二叉树)它的平均查找长度为O(logN)

  2. 若二叉排序树是一个只有右(左)孩子的单支树(类似于有序的单链表),则其平均查找长度为O(N)

在这里插入图片描述
a图的平均搜索成功长度ASL:类似折半查找(1x1 + 2x2+……h×2h-1) )(每层的节点不一定放满,需要针对题目灵活处理)
(1×1+2×2+3×4+4×3)÷10=2.9

b图的平均搜索成功长度ASL:(1+10)/2=5.5
因为此时搜索二叉树由树型退化为线型,平均搜索长度为(n+1)/2

二叉排序树与二分查找相似。就平均时间性能而言,二叉排序树上的查找和二分查找差不多。

但二分查找的判定树唯一,而二叉排序树的查找不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树。

二叉排序树与二分搜索:

  1. 二叉排序树无须移动结点,只需修改指针即可完成插入和删除操作, 平均执行时间为O(logN)
  2. 二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是O(n)。
  3. 当有序表是静态查找表时,宜用顺序表作为其存储结构,采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二叉排序树作为其逻辑结构.

2. C++实现

// 二叉搜索树头文件实现
#include <iostream>
#include <vector>
#include <algorithm>struct TreeNode
{int _val;TreeNode *_left;TreeNode *_right;TreeNode(int val) : _val(val), _left(nullptr), _right(nullptr) {}
};class SearchTree
{
private:TreeNode *root = nullptr;/*** @brief 在二叉搜索树中查找节点值为val的节点** @param val 查找节点的值* @param node 如果找到了这个节点,node就是这个节点的地址,否则为null* @param part part这个节点的父亲,如果这个节点为null,这个参数输出null*/void _find(int val, TreeNode *&node, TreeNode *&part){TreeNode *ptr = root;TreeNode *prev = nullptr;while (ptr != nullptr){if (ptr->_val == val){node = ptr;break;}else if (ptr->_val > val){prev = ptr;ptr = ptr->_left;}else{prev = ptr;ptr = ptr->_right;}}node = ptr;part = prev;}bool _erase(int val, TreeNode *&node){if (node == nullptr){return false;}else{if (node->_val > val){_erase(val, node->_left);}else if (node->_val < val){_erase(val, node->_right);}else{if (node->_left == nullptr){TreeNode *del = node;node = node->_right;delete del;}else if (node->_right == nullptr){TreeNode *del = node;node = node->_left;delete del;}else{// 找要删除节点的后继TreeNode *right_min_node = node->_right;while (right_min_node->_left != nullptr){right_min_node = right_min_node->_left;}// 记录right_min_node这个节点的值,吧这个节点的值和node节点交换,在删除right_min_node这个节点即可// right_min_node这个节点的左子树一定为空,在上面顶点流程会处理int tmp = right_min_node->_val;_erase(tmp, node->_right);node->_val = tmp;}}return true;}}// 判断一棵树是否是二叉搜索树,检查每个节点是否满足节点值的取值范围bool _isSearchTree(TreeNode *node, int min, int max){if (node == nullptr)return true;if (node->_val < min || node->_val > max){return false;}return _isSearchTree(node->_left, min, node->_val - 1) && _isSearchTree(node->_right, node->_val + 1, max);}void _display_inorder(TreeNode *node){if (node == nullptr)return;_display_inorder(node->_left);std::cout << node->_val << " ";_display_inorder(node->_right);}int _max(){TreeNode *node = root;while (node->_right != nullptr){node = node->_right;}return node->_val;}int _min(){TreeNode *node = root;while (node->_left != nullptr){node = node->_left;}return node->_val;}public:SearchTree() = default;SearchTree(const std::vector<int> &buff){for (int i = 0; i < buff.size(); i++){insert(buff[i]);}}// 不允许重复插入相同的值bool insert(int val){if (root == nullptr){root = new TreeNode(val);return true;}else{TreeNode *pos = nullptr;TreeNode *prev = nullptr;_find(val, pos, prev);if (pos != nullptr){// 之前插入过,值重复return false;}else{// pos==nullptr;if (prev->_val > val){prev->_left = new TreeNode(val);}else{prev->_right = new TreeNode(val);}return true;}}}// 查找节点值为val的节点bool find(int val){TreeNode *node;TreeNode *part;_find(val, node, part);return node != nullptr;}// 删除搜索二叉树节点bool erase(int val){return _erase(val, root);}// 判断这颗树是否为二叉搜索树bool isSearchTree(){return _isSearchTree(root, _min(), _max());}// 中序遍历二叉搜索树void inorder(){_display_inorder(root);std::cout << "\n";}
};

测试代码:

#include "SearchTree.h"
#include <time.h>using namespace std;#define TIMES 10int main(int argc, char const *argv[])
{srand((unsigned int)time(0));// vector<int> ret = {1, 2, 3};vector<int> ret;for (int i = 0; i < TIMES; i++){ret.push_back(rand() % 100);}SearchTree tree(ret);tree.inorder();tree.insert(40);tree.inorder();cout << tree.isSearchTree() << endl;tree.insert(1);tree.erase(40);tree.inorder();cout << tree.isSearchTree() << endl;return 0;
}

在这里插入图片描述

http://www.ds6.com.cn/news/87010.html

相关文章:

  • 如何在网站做qq群链接沙洋县seo优化排名价格
  • 佛山网站免费制作网上做广告宣传
  • 公司想为一个产品做多个网站花都网站建设公司
  • 建立企业的网站有哪几种方案国色天香站长工具
  • 网站开发基础教程免费的推广平台
  • 河北新出现的传染病贵阳seo网站管理
  • 济南网站建设q479185700惠怎么做起泡胶
  • 推荐网站建设品牌百度推广开户渠道公司
  • 仿 手机 网站模板html源码html期末大作业个人网站制作
  • 商标查询网站怎么做网络广告营销的特点
  • 专门做机器人大战的网站叫什么常用于网站推广的营销手段是
  • 2023全国疫情爆发时间表东莞seo建站公司哪家好
  • 最超值的锦州网站建设广州seo招聘网
  • 做网站 价格网络视频营销策略有哪些
  • 基础建设期刊在哪个网站可以查深圳网络推广外包
  • 建设文化网站的目的和意义推广app赚佣金平台
  • 建设网站的要求吗seo入门教学
  • 企业网站和信息化建设关键词排名查询网站
  • 电子科技网站建设建设网站公司
  • php网站开发哪个培训学校好重庆网站seo教程
  • com域名的网站百度网页浏览器
  • html5动态效果的网站是怎么做的整合营销的概念
  • 昌邑做网站的公司网络营销郑州优化推广公司
  • 系统门户网站建设常用功能如何在百度上开店铺
  • 开发建设网站免费推广网站大全下载安装
  • 建设项目竣工验收公示网站百度公司官方网站
  • 做网站就业要会什么怎样通过网络销售自己的产品
  • 哈尔滨网站建设优化浙江网站建设推广
  • apache限制域名访问网站百度seo关键词优化方案
  • yy4008青苹果高清电影院安卓优化大师旧版本下载