视频多的网站建设烟台市两学一做网站
2026/2/15 23:21:46 网站建设 项目流程
视频多的网站建设,烟台市两学一做网站,做网站域名是赠送的吗,做网站的软件dw二叉搜索树#xff08;Binary Search Tree, BST#xff09; 的 C 简单实现 包含最常见的增、删、查、改操作#xff0c;以及一些常用辅助函数。 以下代码尽量写得清晰、结构化#xff0c;适合学习与理解。 #include iostream #include queue #include Binary Search Tree, BST的 C 简单实现包含最常见的增、删、查、改操作以及一些常用辅助函数。以下代码尽量写得清晰、结构化适合学习与理解。#includeiostream#includequeue#includevectorusingnamespacestd;// BST 节点定义structNode{intval;Node*left;Node*right;Node(intv):val(v),left(nullptr),right(nullptr){}};classBinarySearchTree{private:Node*root;// 辅助函数递归插入Node*insertHelper(Node*node,intval){if(nodenullptr){returnnewNode(val);}if(valnode-val){node-leftinsertHelper(node-left,val);}elseif(valnode-val){node-rightinsertHelper(node-right,val);}// 相等时可以选择不插入或覆盖/计数此处选择不插入returnnode;}// 辅助函数查找节点返回节点指针Node*findHelper(Node*node,intval){if(nodenullptr||node-valval){returnnode;}if(valnode-val){returnfindHelper(node-left,val);}else{returnfindHelper(node-right,val);}}// 辅助函数找最小值节点用于删除时找后继Node*findMin(Node*node){while(nodenode-left){nodenode-left;}returnnode;}// 辅助函数删除节点递归版Node*removeHelper(Node*node,intval){if(nodenullptr){returnnullptr;}if(valnode-val){node-leftremoveHelper(node-left,val);}elseif(valnode-val){node-rightremoveHelper(node-right,val);}else{// 找到要删除的节点// 情况1没有子节点叶子if(node-leftnullptrnode-rightnullptr){deletenode;returnnullptr;}// 情况2只有一个子节点elseif(node-leftnullptr){Node*tempnode-right;deletenode;returntemp;}elseif(node-rightnullptr){Node*tempnode-left;deletenode;returntemp;}// 情况3有两个子节点 → 用右子树的最小节点替换else{Node*successorfindMin(node-right);node-valsuccessor-val;// 复制值node-rightremoveHelper(node-right,successor-val);// 删除后继}}returnnode;}// 辅助函数中序遍历验证 BST 是否正确voidinorderHelper(Node*node){if(nodenullptr)return;inorderHelper(node-left);coutnode-val ;inorderHelper(node-right);}// 销毁整棵树析构函数调用voiddestroyTree(Node*node){if(nodenullptr)return;destroyTree(node-left);destroyTree(node-right);deletenode;}public:BinarySearchTree():root(nullptr){}~BinarySearchTree(){destroyTree(root);}// 插入voidinsert(intval){rootinsertHelper(root,val);}// 查找是否存在boolfind(intval){returnfindHelper(root,val)!nullptr;}// 查找并返回节点指针用于修改值Node*findNode(intval){returnfindHelper(root,val);}// 删除voidremove(intval){rootremoveHelper(root,val);}// 修改某个节点的值先查找再修改boolupdate(intoldVal,intnewVal){Node*nodefindNode(oldVal);if(nodenullptr){returnfalse;}// 先删除旧值再插入新值最安全避免破坏 BST 性质remove(oldVal);insert(newVal);returntrue;}// 中序遍历应该输出有序序列voidinorder(){cout中序遍历: ;inorderHelper(root);coutendl;}// 层序遍历调试用voidlevelOrder(){if(!root)return;queueNode*q;q.push(root);cout层序遍历: ;while(!q.empty()){Node*nodeq.front();q.pop();coutnode-val ;if(node-left)q.push(node-left);if(node-right)q.push(node-right);}coutendl;}// 判断是否为空boolempty()const{returnrootnullptr;}// 获取根节点值仅用于调试intgetRootVal()const{returnroot?root-val:-1;}};// 测试代码intmain(){BinarySearchTree bst;// 插入测试vectorintarr{50,30,70,20,40,60,80,15,25,35,45};for(intx:arr){bst.insert(x);}cout插入后endl;bst.inorder();// 应该有序bst.levelOrder();// 查找cout\n查找 40: (bst.find(40)?存在:不存在)endl;cout查找 100: (bst.find(100)?存在:不存在)endl;// 修改把 40 改为 42cout\n修改 40 → 42: (bst.update(40,42)?成功:失败)endl;bst.inorder();// 删除cout\n删除 30endl;bst.remove(30);bst.inorder();cout\n删除 70有两个孩子endl;bst.remove(70);bst.inorder();cout\n删除 15叶子节点endl;bst.remove(15);bst.inorder();return0;}快速记忆要点面试/刷题常用操作 | 时间复杂度平均 | 时间复杂度最坏 | 备注—|—|—查找 | O(log n) | O(n) | 最坏退化为链表插入 | O(log n) | O(n) | 同上删除 | O(log n) | O(n) | 两个孩子的情况最复杂中序遍历 | O(n) | O(n) | 天然有序常见面试追问方向如何判断一棵二叉树是否是 BST中序遍历是否严格递增如何求 BST 的第 k 小元素中序遍历计数 / 记录子树大小BST 如何转成双向链表中序遍历 指针调整如何在 BST 中找最近公共祖先类似二叉树 LCA但利用大小关系更快如何实现一个支持重复元素的 BST在 Node 中加 count 字段需要哪一部分再展开讲解比如删除两种写法对比、平衡 BST 引出 AVL/红黑树、BST 转链表代码等可以直接告诉我

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询