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

专业网站定制团队网域名解析ip查询

专业网站定制团队,网域名解析ip查询,网站推广基本预算,免费的图库网站目录 前言一、定义二、基本操作三、时间复杂度分析四、变体五、动态图解六、代码模版七、经典例题[1.——700. 二叉搜索树中的搜索](https://leetcode.cn/problems/search-in-a-binary-search-tree/)代码题解 [2.——938. 二叉搜索树的范围和](https://leetcode.cn/problems/ra… 目录 前言一、定义二、基本操作三、时间复杂度分析四、变体五、动态图解六、代码模版七、经典例题[1.——700. 二叉搜索树中的搜索](https://leetcode.cn/problems/search-in-a-binary-search-tree/)代码题解 [2.——938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)代码题解 [3.——98. 验证二叉搜索树](https://leetcode.cn/problems/validate-binary-search-tree/)代码题解 八、总结结语 前言 这一期我们一起来学习二叉搜索树。二叉搜索树Binary Search Tree, BST是一种重要的数据结构在计算机科学中广泛应用于查找、插入和删除操作。以下是对二叉搜索树的基本分析包括其定义、性质、操作的时间复杂度以及一些变体。 一、定义 二叉搜索树是一种二叉树其中每个节点包含一个键值且满足以下性质 左子树性质左子树中所有节点的键值都小于根节点的键值。 右子树性质右子树中所有节点的键值都大于根节点的键值。 递归性质左子树和右子树本身也是二叉搜索树。 二、基本操作 1.查找Search 算法从根节点开始如果目标键值小于当前节点的键值则递归地在左子树中查找如果目标键值大于当前节点的键值则递归地在右子树中查找如果找到目标键值则返回该节点。 时间复杂度在最坏情况下树退化为链表时间复杂度为 O(n)在最优情况下树是平衡的时间复杂度为 O(logn)。 2.插入Insert 算法从根节点开始找到合适的位置插入新节点。如果目标键值小于当前节点的键值则递归地在左子树中查找插入位置如果目标键值大于当前节点的键值则递归地在右子树中查找插入位置如果目标键值已经存在则根据具体需求更新节点例如更新节点的值或不做任何操作。 时间复杂度与查找操作类似最坏情况下为 O(n)最优情况下为 O(logn)。 3.删除Delete 算法找到要删除的节点然后分三种情况处理 叶子节点直接删除。 只有一个子节点用其子节点替代被删除节点。 有两个子节点找到该节点的中序后继或中序前驱用其值替代被删除节点的值然后递归删除中序后继或中序前驱。 时间复杂度最坏情况下为 O(n)最优情况下为 O(logn)。 三、时间复杂度分析 二叉搜索树的时间复杂度依赖于树的高度。在最坏情况下树退化为链表树的高度为 n因此各种操作的时间复杂度均为 O(n)。然而在最优情况下树是平衡的树的高度为 logn因此各种操作的时间复杂度均为 O(logn)。 四、变体 为了改善二叉搜索树在最坏情况下的性能人们提出了多种变体 平衡二叉搜索树Balanced BST如AVL树、红黑树等通过维护树的平衡来确保操作的时间复杂度始终为 O(logn)。 B树B-Tree一种自平衡的树能够保持数据有序其设计目的是减少磁盘I/O操作广泛应用于数据库和文件系统。 伸展树Splay Tree在每次查找操作后通过一系列旋转操作将查找路径上的节点重新组织成一条链使得下次查找更加高效。 五、动态图解 元素查找 元素插入 元素删除 中序遍历 六、代码模版 #includeiostream using namespace std;templatetypename T struct TreeNode {T val;TreeNode* left;TreeNode* right;TreeNode(T x):val(x),left(NULL),right(NULL){}TreeNode():val(0),left(NULL),right(NULL){} };templatetypename T class BinarySearchTree { private:TreeNodeT* root;TreeNodeT* insertNode(TreeNodeT* node, T val);TreeNodeT* removeNode(TreeNodeT* node, T val);bool searchNode(TreeNodeT* node, T val);void inOrder(TreeNodeT* node); public:BinarySearchTree():root(NULL){}~BinarySearchTree();void insert(T val) {root insertNode(root, val);}void remove(T val) {root removeNode(root, val);}bool search(T val) {return searchNode(root, val);}void inOrderTraversal() {inOrder(root);cout endl;} };templatetypename T BinarySearchTreeT::~BinarySearchTree() {while (root) {remove(root-val);//每次都把root节点删除每次删除都产生新的root节点} }templatetypename T TreeNodeT* BinarySearchTreeT::insertNode(TreeNodeT* node, T val) {if (!node) {return new TreeNodeT(val);//递归出口该节点为空时就说明插入到当前位置定义新的变量接收val}if (node-val val) {node-left insertNode(node-left, val);}else if (node-val val) {node-right insertNode(node-right, val);}return node;//说明当前节点与插入节点的值一致返回该节点即可 }templatetypename T TreeNodeT* BinarySearchTreeT::removeNode(TreeNodeT* node, T val) {if (!node)return NULL;//递归出口如果找完了整棵树都没找到该值就返回NULLif (node-val val) node-left removeNode(node-left, val);else if (node-val val)node-right removeNode(node-right, val);else {//该节点的值等于要删除节点的值一致就说明找到了if (node-left NULL node-right NULL) {//如果该节点为叶子结点接直接删除该节点就行delete node;return NULL;//因为删除了该节点所以它就为空了返回即可}else if (node-left NULL) {//要删除的节点只有右节点TreeNodeT* rightChild node-right;//定义一个变量储存该节点右节点的树delete node;return rightChild;}else if (node-right NULL) {//与上同理TreeNodeT* leftChild node-left;delete node;return leftChild;}else {//如果左右节点都有TreeNodeT* replacement node-right;//从右子树中找值最小的节点while (replacement-left) {replacement replacement-left;}node-val replacement-val;//找到之后赋给该节点node-right removeNode(node-right, replacement-val);//最后在删除最小值的节点}}return node; }templatetypename T bool BinarySearchTreeT::searchNode(TreeNodeT* node, T val) {if (!node)return false;//递归出口如果找完了整棵树都没找到该值就返回falseif (val node-val) {//递归查找如果要查找的值小于当前节点那么就继续递归找左节点return searchNode(node-left, val);}else if (val node-val) return searchNode(node-right, val);//与上同理return true; }templatetypename T void BinarySearchTreeT::inOrder(TreeNodeT* node) {if (node) {//中序遍历inOrder(node-left);cout node-val ,;inOrder(node-right);} }int main() {BinarySearchTreeint bst;bst.insert(30);bst.insert(10);bst.insert(20);bst.insert(40);bst.insert(90);bst.insert(69);bst.inOrderTraversal();//中序遍历为递增有序的数列bst.remove(40);bst.inOrderTraversal();return 0; }七、经典例题 1.——700. 二叉搜索树中的搜索 蓝色字体可以点进去看原题 代码题解 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(rootNULL)return NULL;if(valroot-val)return searchBST(root-right,val);else if(root-valval)return searchBST(root-left,val);return root;} };2.——938. 二叉搜索树的范围和 代码题解 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:int rangeSumBST(TreeNode* root, int low, int high) {if(rootNULL)return 0;int sum0;if(root-vallowroot-valhigh){sumroot-val;}sumrangeSumBST(root-left,low,high);sumrangeSumBST(root-right,low,high);return sum;} };3.——98. 验证二叉搜索树 代码题解 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution {vectorint ret;void inOrder(TreeNode*root){if(root){inOrder(root-left);ret.push_back(root-val);inOrder(root-right);}} public:bool isValidBST(TreeNode* root) {ret.clear();inOrder(root);//中序遍历之后就是递增的数列for(int i1;iret.size();i){if(ret[i]ret[i-1])return false;}return true;} };八、总结 二叉搜索树是一种简单而有效的数据结构适用于许多查找、插入和删除操作。然而其性能受树的高度影响因此在最坏情况下可能退化为链表。为了克服这一缺点可以使用平衡二叉搜索树等变体来确保操作的时间复杂度始终为 O(logn)。 结语 下期我会更新二叉搜索树的题库一共十多道希望大家看完之后能去多多刷题巩固和运用知识点敬请期待下期文章。 相信大家通过本期学习初步了解二叉树下期作品我会更新二叉树的十几道题库我们下期一起学习二叉树的实战应用。
http://www.dnsts.com.cn/news/152793.html

相关文章:

  • 第三方网站下载素材是怎么做上海传媒公司总裁是谁
  • 做网站需注意事项户县网站建设
  • vps如何做网站步骤亚马逊新店投广告是免费的吗
  • 网站建站网站域名申请网站开发工具是啥
  • 找装修公司网站WordPress外网404
  • 常德注册公司流程及费用河南做网站优化
  • 云南网站建设招商房地产政策最新消息2022
  • 新网站做seo优化步骤做响应式网站的体会
  • 临沂做网站建设的公司长春火车站进站需要核酸检测吗
  • 苏州网站建设情况pc网站建设和推广
  • 假发网站是怎么做的利用百度网盘自动播放做视频网站
  • 烟台cms建站模板网站开发一般多钱
  • 湘潭网站建设 多少钱磐石网络seo排名第一
  • 照片网站cms普陀区网站建设前端
  • 深圳最好用的网站设计莆田个人仿牌外贸网站建设
  • 安徽柱石建设有限公司网站揭阳市建设局网站
  • 英语教育网站建设凡科建站骗子
  • 有专门做辩论的网站吗建设银行网站驱动
  • 合肥最好的网站建设公司西安好的皮肤管理做团购网站
  • 厦门做网站公司排名母婴策划案的网站建设
  • dw做网站表格插不到右边wordpress 对空间要求
  • 学校官网在哪里找采集网站seo
  • wordpress制作网站教程西安做网站xamokj
  • 建设宠物网站的可行性如何去掉wordpress
  • 毕业设计网站代做多少钱网络营销培训班哪家好
  • 网站域名注销备案怎么安装php网站
  • 婚庆网站源码烟台制作网站有哪些
  • 建网站的公司深圳给我一个网站
  • 高端网站建设加盟久久建筑网是个什么样的网站
  • 广州市品牌网站建设平台实名网站空间哪里买