Splay Tree的插入操作，搜索操作，和删除操作都实现了，那么就能够使用来解题了。

```#pragma once
#include <stdio.h>

class SplayTreeComplete
{
struct Node
{
int key;
Node *left, *right;
explicit Node(int k):key(k),left(NULL),right(NULL){}
/*~Node()
{教训：这种话整颗树都删除了，不能这么删除，要逐个节点删除
if (left) delete left, left = NULL;
if (right) delete right, right = NULL;
}*/
};

Node *leftRotate(Node *x)
{
Node *y = x->right;
x->right = y->left;
y->left = x;
return y;
}

Node *rightRotate(Node *x)
{
Node *y = x->left;
x->left = y->right;
y->right = x;
return y;
}

Node *splay(Node *root, const int key)
{
if (!root || key == root->key) return root;

if (key < root->key)
{
if (!root->left) return root;

if (key < root->left->key)
{
root->left->left = splay(root->left->left, key);
root = rightRotate(root);
}
else if (root->left->key < key)
{
root->left->right = splay(root->left->right, key);
if (root->left->right) root->left = leftRotate(root->left);
}
return root->left? rightRotate(root) : root;
}

if (!root->right) return root;
if (root->right->key < key)
{
root->right->right = splay(root->right->right, key);
root = leftRotate(root);
}
else if (key < root->right->key)
{
root->right->left = splay(root->right->left, key);
if (root->right->left) root->right = rightRotate(root->right);
}
return root->right? leftRotate(root) : root;
}

Node *insert(Node *root, const int key)
{
if (!root) return new Node((int)key);//别忘了创建新的节点

root = splay(root, key);//别忘了 root =

if (key == root->key) return root;

Node *newNode = new Node((int)key);
if (key < root->key)
{
newNode->right = root;
newNode->left = root->left;
root->left = NULL;//别漏了这句，否则破坏了树结构
}
else
{
newNode->left = root;
newNode->right = root->right;
root->right = NULL;
}
return newNode;
}

Node *deleteNode(Node *root, const int key)
{
if (!root) return root;

root = splay(root, key);

if (key == root->key)
{
if (!root->left)
{
Node *x = root;
root = root->right;
delete x, x = NULL;
}
else
{
Node *x = root->right;
Node *y = root->left;
delete root;
root = splay(y, key);
root->right = x;
}
}
return root;
}

void preOrder(Node *root)
{
if (root != NULL)
{
printf("%d ", root->key);
preOrder(root->left);
preOrder(root->right);
}
}
public:
SplayTreeComplete()
{
Node *root = NULL;
int keys[] = {100, 50, 200, 40, 30, 20, 25};
int n = sizeof(keys) / sizeof(keys[0]);
for (int i = 0; i < n; i++)
{
root = insert(root, keys[i]);
}

printf("\nInser create Preorder traversal Splay tree is \n");
preOrder(root);
putchar('\n');

root = splay(root, 50);
bool found = root->key == 50;

printf("\n50 is %s the tree\n", found? "in" : "not in");

root = deleteNode(root, 50);//root 发生改变了，所以必须返回新的指针值

root = splay(root, 50);
found = root->key == 50;

printf("\n50 is %s the tree\n", found? "in" : "not in");

printf("\nInser create Preorder traversal Splay tree is \n");
preOrder(root);
putchar('\n');

deleteTree(root);
}

void deleteTree(Node *root)
{
if (root)
{
deleteTree(root->left);
deleteTree(root->right);
delete root, root = NULL;
}
}
};```

## Splay Tree的删除操作的更多相关文章

1. HDU1890 Robotic Sort Splay tree反转,删除

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题目中涉及数的反转和删除操作,需要用Splay tree来实现.首先对数列排序,得到每个数在数列 ...

2. POJ-3468 A Simple Problem with Integers Splay Tree区间练习

题目链接:http://poj.org/problem?id=3468 以前用线段树做过,现在用Splay Tree A了,向HH.kuangbin.cxlove大牛学习了各种Splay各种操作,,, ...

3. HDU-3436 Queue-jumpers 树状数组 | Splay tree删除,移动

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3436 树状数组做法<猛戳> Splay tree的经典题目,有删除和移动操作.首先要离散化 ...

4. splay tree旋转操作 hdu 1890

很神奇的旋转操作. 目前没看到其他数据结构能实现这个功能.平衡树不好处理区间操作,线段树很难旋转.splay tree搞这个就很简单了. 下面用的这个模板跑了700ms,好慢,估计是删除操作太费时了, ...

5. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

6. 伸展树 Splay Tree

Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...

7. [转] Splay Tree(伸展树)

好久没写过了,比赛的时候就调了一个小时,差点悲剧,重新复习一下,觉得这个写的很不错.转自:here Splay Tree(伸展树) 二叉查找树(Binary Search Tree)能够支持多种动态集 ...

8. 树-伸展树(Splay Tree)

伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二 ...

9. Splay tree

类别:二叉排序树 空间效率:O(n) 时间效率:O(log n)内完成插入.查找.删除操作 创造者:Daniel Sleator和Robert Tarjan 优点:每次查询会调整树的结构,使被查询频率 ...

## 随机推荐

1. No module named migrate.versioning

在学习mega-tutorial的数据库章节时创建数据库遇到了问题,在stackoverflow上找到了结果 pip install sqlalchemy==0.7.9 pip install sql ...

2. myeclipse启动报错 no java virtual machine。。。

如果环境变量里已经配置了JAVA_HOME,但是在启动的时候还会提示下面的信息:   A Java Runtime Environment (JRE) or Java Development Kit ...

3. ACM2096_小明A+B

#include<iostream> int main() { using namespace std; int a,b,count; cin>>count; while(co ...

4. ACM之跳骚---ShinePans

Description Z城市居住着非常多仅仅跳蚤.在Z城市周六生活频道有一个娱乐节目.一仅仅跳蚤将被请上一个高空钢丝的正中央.钢丝非常长,能够看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...

5. 记使用aliyun-log-logback-appender 报错no applicable action for [encoder], current ElementPath is [[configuration][appender][encoder]]

依赖: <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliy ...

6. MySQL添加用户错误:ERROR 1364 (HY000): Field &#39;ssl_cipher&#39; doesn&#39;t have a default value解决方法

MySQL添加新用户时出现如下报错,如下图: 经过查资料了解到: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 改为以 ...

7. 使用第三方组件(django-redis)创建连接池

settings里面: ##redis配置CACHES={ 'default':{ 'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'red ...

8. 清明　DAY２

数论 数论是研究整数性质的东西 也就是 lim   π(x)=x/ ln x (x->无穷) 证明: ∵ p|ab ∴ ab有因子p 设 a=p1k1p2k2......prkr      b= ...

9. Chrome 解决flash问题

Chrome 无法显示使用插件的内容 Chrome 不再支持很多插件.不过网站创建者已经通过更安全的方式,将多数这类功能添加到 Chrome 中. 为什么 NPAPI 插件现在无法正常运行过去,许多插 ...

10. Android怎样设置圆角button

1. 在res文件夹下的drawable文件夹下新建shape.xml文件 <?xml version="1.0" encoding="utf-8"?&g ...