Q u a s i B i n a r y S e a r c h T r e e Quasi\ Binary\ Search\ Tree Quasi Binary Search Tree
题目描述见链接 .
正 解 部 分 \color{red}{正解部分} 正解部分
题目要求 字典序最小 的 伪二叉树,
我们只需要在满足 一颗子树编号全部比根节点小, 另一颗子树编号全部比根节点大 的前提下 , 使得 序号越小的节点编号越小 即可 .
这个问题可以 分治 解决,
设
m
n
[
k
]
mn[k]
mn[k] 表示 以
k
k
k 为根的子树中最小序号为
k
k
k, 当前可分配的编号区间为
[
l
,
r
]
[l, r]
[l,r], 当前根节点为
k
k
k,
分 类 讨 论 : 分类讨论: 分类讨论:
- 有两个儿子,
-
m
n
[
k
]
=
k
:
mn[k] = k:
mn[k]=k:
- 两子树大小不等, 此时哪颗子树的 s i z e size size 小, 就取哪颗子树当 左子树.
- 两子树大小相等, 此时比较两颗子树的 m n [ ] mn[] mn[], 取较小值当 左子树 .
- m n [ k ] ≠ k : mn[k] \not = k: mn[k]=k: 取两颗子树中 m x [ ] mx[] mx[] 较小的当 左子树 ,
-
m
n
[
k
]
=
k
:
mn[k] = k:
mn[k]=k:
- 有一个儿子,
- m n [ k ] = m n [ l t ] : mn[k]= mn[lt]: mn[k]=mn[lt]: l t lt lt 当 左子树 .
- m n [ k ] ≠ m n [ l t ] : mn[k] \not = mn[lt]: mn[k]=mn[lt]: l t lt lt 当 右子树 .
实 现 部 分 \color{red}{实现部分} 实现部分
咕咕咕 .