OSDN Git Service

修改表述
authorSshwy <jy.cat@qq.com>
Mon, 11 May 2020 01:49:03 +0000 (09:49 +0800)
committerGitHub <noreply@github.com>
Mon, 11 May 2020 01:49:03 +0000 (09:49 +0800)
docs/ds/splay.md

index 9b7881f..43ffe56 100644 (file)
@@ -209,17 +209,21 @@ int nxt() {
 }
 ```
 
+### 合并两棵树
+
+合并两棵 Splay 树,设两棵树的根节点分别为 $x$ 和 $y$,那么我们要求 $x$ 树中的最大值小于 $y$ 树中的最小值。删除操作如下:
+
+- 如果 $x$ 和 $y$ 其中之一或两者都为空树,直接返回不为空的那一棵树的根节点或空树。
+- 否则将 $x$ 树中的最大值 $\operatorname{Splay}$ 到根,然后把它的右子树设置为 $y$ 并更新节点的信息,然后返回这个节点。
+
 ### 删除操作
 
 删除操作也是一个比较复杂的操作,具体步骤如下:
 
--   首先将 $x$ 旋转到根的位置。
--   接下来分为多个情况考虑:
+首先将 $x$ 旋转到根的位置。
 
-1.  如果有不止一个 $x$ ,那么将 $cnt[x]$ 减 $1$ 并退出。
-2.  如果 $x$ 没有儿子节点,那么直接将当前节点 $\text{clear}$ 并退出。
-3.  如果 $x$ 只有一个儿子,那么先将当前节点 $\text{clear}$ 再把唯一的儿子作为根节点。
-4.  否则将 $x$ 的前驱旋转到根并作为根节点,将 $x$ 的右子树接到根节点的右子树上,最后要将根的信息更新。
+-   如果$cnt[x]>1$(有不止一个 $x$) ,那么将 $cnt[x]$ 减 $1$ 并退出。
+-   否则,合并它的左右两棵子树即可。
 
 ```cpp
 void del(int k) {
@@ -257,15 +261,6 @@ void del(int k) {
 }
 ```
 
-### 简单合并
-
-简单合并两棵 Splay 树,两棵树的根节点分别为 $x$ 和 $y$ 且 $x$ 为根的树当中的所有关键词都小于 $y$ 为根的树当中的任意关键词,如果 $x$ 和 $y$ 其中之一或两者都为空树,直接返回不为空的那一棵树的根节点或空,否则将 $x$ 为根的树中最右边的节点 $\operatorname{splay}$ 到根并把这个节点的右子树设置为 $y$ 并更新节点的信息,返回这个节点。
-
-对于上述删除操作,有两种方法(Tarjan 在他的论文中更推荐后者):
-
-1.  将待删除节点 $\operatorname{splay}$ 到根后合并待删除节点左右两棵子树(这是上述的方法)。
-2.  找到待删除节点后合并待删除节点左右两棵子树代替待删除节点并 $\operatorname{splay}$ 该节点的双亲节点(如果存在的话)。
-
 * * *
 
 ## 完整代码