C++伸展树与红黑树实现详解

张开发
2026/4/23 8:01:27 15 分钟阅读

分享文章

C++伸展树与红黑树实现详解
好的我将为你详细讲解C中的伸展树和红黑树的实现原理与代码示例。伸展树Splay Tree伸展树是一种自适应二叉搜索树通过伸展操作splaying将最近访问的节点移动到根节点附近从而提升后续访问效率。其核心操作包括旋转zig, zag, zig-zig等均摊时间复杂度为 $O(\log n)$。基本操作查找找到目标节点后执行伸展操作。插入插入新节点后执行伸展。删除将待删除节点伸展至根删除后合并子树。C 节点定义struct SplayNode { int key; SplayNode *left, *right; };伸展操作示例SplayNode* splay(SplayNode* root, int key) { if (!root || root-key key) return root; if (key root-key) { // 左子树处理示例为zig操作 if (!root-left) return root; if (key root-left-key) { // zig-zig root-left-left splay(root-left-left, key); root rotateRight(root); // 右旋 } // 其他旋转情况... } // 对称处理右子树 return root; }红黑树Red-Black Tree红黑树是一种自平衡二叉搜索树通过颜色标记和旋转操作维持近似平衡确保操作时间复杂度为 $O(\log n)$。需满足以下性质节点为红或黑。根节点为黑。叶节点NIL为黑。红节点的子节点必为黑。从任一节点到叶节点的路径包含相同数量黑节点。C 节点定义enum Color { RED, BLACK }; struct RBNode { int key; Color color; RBNode *left, *right, *parent; };插入修复双红冲突处理void fixInsert(RBTree* tree, RBNode* node) { while (node-parent node-parent-color RED) { RBNode* uncle getUncle(node); // 获取叔节点 if (uncle uncle-color RED) { // Case 1: 叔节点为红 recolor(node); } else { // Case 2 3: 叔节点为黑需旋转 if (isLeftChild(node) ! isLeftChild(node-parent)) { rotate(node); // 折线型先旋转父节点 } rotate(node-parent); // 再旋转祖父节点 swapColors(node-parent, node-parent-parent); } } tree-root-color BLACK; // 根节点始终为黑 }完整红黑树实现框架class RedBlackTree { private: RBNode* root; RBNode* insertHelper(RBNode* root, RBNode* node); void fixViolation(RBNode* node); // 旋转函数leftRotate, rightRotate public: void insert(int key); void delete(int key); };http://my.tv.sohu.com/us/442516649/709692713.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjcxMy5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692478.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjQ3OC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692724.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjcyNC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692570.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjU3MC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692500.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjUwMC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692657.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjY1Ny5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692661.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjY2MS5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692740.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5Mjc0MC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692836.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5MjgzNi5zaHRtbA.htmlhttp://my.tv.sohu.com/us/442516649/709692847.shtmlhttps://tv.sohu.com/v/dXMvNDQyNTE2NjQ5LzcwOTY5Mjg0Ny5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709691878.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MTg3OC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709691887.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MTg4Ny5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709692069.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MjA2OS5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709691897.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MTg5Ny5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709692081.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MjA4MS5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709692139.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MjEzOS5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709692149.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MjE0OS5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709691993.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MTk5My5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709691998.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MTk5OC5zaHRtbA.htmlhttp://my.tv.sohu.com/us/443346928/709692234.shtmlhttps://tv.sohu.com/v/dXMvNDQzMzQ2OTI4LzcwOTY5MjIzNC5zaHRtbA.html对比总结特性伸展树红黑树平衡方式访问时自适应伸展颜色约束 旋转时间复杂度均摊 $O(\log n)$严格 $O(\log n)$适用场景局部性强的访问如缓存稳定性能需求如STL map红黑树是C STL中std::map和std::set的底层实现其稳定性更适合工业级应用。如果需要完整代码实现或进一步优化细节请随时告知

更多文章