1.二叉搜索树:
设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其父结点。证明: y . k e y y.key y.key或者是 T T T树中大于 x . k e y x.key x.key的最小关键字,或者是 T T T树中小于 x . k e y x.key x.key的最大关键字。
1.
1.
1.当
x
x
x是
y
y
y的左孩子结点时:
假设在树
T
T
T中存在一个结点
z
z
z满足
z
.
k
e
y
>
x
.
k
e
y
&
&
z
.
k
e
y
<
y
.
k
e
y
z.key>x.key\ \&\&\ z.key<y.key
z.key>x.key && z.key<y.key,由于
T
T
T是一棵关键字互不相同的二叉搜索树,所以结点
z
z
z只能是结点
y
y
y的左孩子结点,或者是
y
y
y的父亲结点且结点
y
y
y是结点
z
z
z的右孩子结点。
对上述两种情况,若结点
z
z
z是结点
y
y
y的左孩子结点,由于
x
x
x是
y
y
y的左孩子结点且
x
x
x是一个叶结点,所以此时结点
z
z
z就是结点
x
x
x,与假设
z
.
k
e
y
>
x
.
k
e
y
z.key>x.key
z.key>x.key相矛盾,所以不成立;若
z
z
z是
y
y
y的父亲结点且结点
y
y
y是
z
z
z的右孩子结点,此时
x
x
x和
y
y
y都在结点
z
z
z的右子树中,所以此时虽然
z
.
k
e
y
<
y
.
k
e
y
z.key<y.key
z.key<y.key但
x
.
k
e
y
>
z
.
k
e
y
x.key>z.key
x.key>z.key,与假设
z
.
k
e
y
>
x
.
k
e
y
z.key>x.key
z.key>x.key相矛盾,所以当
x
x
x是
y
y
y的左孩子结点时:
y
.
k
e
y
y.key
y.key是
T
T
T树中大于
x
.
k
e
y
x.key
x.key的最小关键字。
2.
2.
2.当
x
x
x是
y
y
y的右孩子结点时:
同理,结点
z
z
z只能是结点
y
y
y的右孩子结点,或者是
y
y
y的父亲结点且结点
y
y
y是结点
z
z
z的左孩子结点。若结点
z
z
z是结点
y
y
y的右孩子结点,则此时结点
z
z
z就是结点
x
x
x,与假设
z
.
k
e
y
<
x
.
k
e
y
z.key<x.key
z.key<x.key相矛盾,所以不成立;若
z
z
z是
y
y
y的父亲结点且结点
y
y
y是
z
z
z的左孩子结点,此时
x
.
k
e
y
<
z
.
k
e
y
x.key<z.key
x.key<z.key,与假设
z
.
k
e
y
<
x
.
k
e
y
z.key<x.key
z.key<x.key相矛盾,所以当
x
x
x是
y
y
y的右孩子结点时:
y
.
k
e
y
y.key
y.key是
T
T
T树中小于
x
.
k
e
y
x.key
x.key的最大关键字。
综上,
y
.
k
e
y
y.key
y.key或者是
T
T
T树中大于
x
.
k
e
y
x.key
x.key的最小关键字,或者是
T
T
T树中小于
x
.
k
e
y
x.key
x.key的最大关键字。
2.红黑树:
(
a
)
(a)
(a)将关键字
41
,
38
,
31
,
12
,
19
,
8
41,38,31,12, 19,8
41,38,31,12,19,8连续地插入一棵初始为空的红黑树之后,试画出该结果树。
(
b
)
(b)
(b)对于
(
a
)
(a)
(a)中得到的红黑树,依次删除
8
,
12
,
19
8, 12, 19
8,12,19试画出每次删除操作后的红黑树。
( a ) (a) (a)
( b ) (b) (b)
3.区间树:
假设我们希望记录一个区间集合的最大重叠点,即被最多数目区间所覆盖的那个点。
(
a
)
(a)
(a)证明:在最大重叠点中,一定存在一个点是其中一个区间的端点。
(
b
)
(b)
(b)设计一个数据结构,使得它能够有效地支持
I
N
T
E
R
V
A
L
−
I
N
S
E
R
T
、
I
N
T
E
R
V
A
L
−
D
E
L
E
T
E
INTERVAL-INSERT、INTERVAL-DELETE
INTERVAL−INSERT、INTERVAL−DELETE以及返回最大重叠点的
F
I
N
D
−
P
O
M
FIND-POM
FIND−POM操作。
(
a
)
(a)
(a)
假设取得一个不在区间端点上的最大重叠点,对于这个点,其所在的区间的左端点或右端点中,必定存在一个端点与这个最大重叠点有着相同的区间数,所以,在最大重叠点中,一定存在一个点是其中一个区间的端点。
(
b
)
(b)
(b)
使用红黑树存储各个区间的端点值,对于每个结点
x
x
x有附加信息
p
(
x
)
、
v
(
x
)
p(x)、v(x)
p(x)、v(x),若结点为一个左端点,则
p
(
x
)
=
1
p(x)=1
p(x)=1,否则
p
(
x
)
=
−
1
p(x)=-1
p(x)=−1,
v
(
x
)
v(x)
v(x)存储以
x
x
x为根结点的所有子结点
p
p
p值与
x
.
p
x.p
x.p与的和。
v
[
x
]
=
v
[
l
e
f
t
[
x
]
]
+
p
[
x
]
+
v
[
r
i
g
h
t
[
x
]
]
v[x]=v[left[x]]+p[x]+v[right[x]]
v[x]=v[left[x]]+p[x]+v[right[x]]
I
N
T
E
R
V
A
L
−
I
N
S
E
R
T
INTERVAL-INSERT
INTERVAL−INSERT:
只需将执行插入操作时经过的所有结点
v
v
v值加上所插入结点的
p
p
p值,其余操作与红黑树的插入操作相同。
I
N
T
E
R
V
A
L
−
D
E
L
E
T
E
INTERVAL-DELETE
INTERVAL−DELETE:
只需将执行删除操作时经过的所有结点
v
v
v值减去被删除结点的
p
p
p值,其余操作与红黑树的删除操作相同。
F
I
N
D
−
P
O
M
FIND-POM
FIND−POM:
给定
n
2
\cfrac{n}{2}
2n个区间,那么总共有
n
n
n个端点,将这
n
n
n个端点按升序排列,若当前是点
i
i
i,则如果在
i
i
i之前出现的区间,只出现了左端点,还没有出现右端点,那么说明该区间与
i
i
i所在区间重叠。如果在
i
i
i之前该区间左右端点都出现过了,那就不会与
i
i
i所在区间重叠,即左端点
p
=
+
1
p=+1
p=+1,右端点
p
=
−
1
p=-1
p=−1,相加为
0
0
0。
令
s
(
i
,
j
)
=
p
(
i
)
+
p
(
i
+
1
)
+
.
.
.
+
p
(
j
)
s(i,j)=p(i)+p(i+1)+...+p(j)
s(i,j)=p(i)+p(i+1)+...+p(j),即从点
i
i
i到点
j
j
j的
p
p
p值之和,则根据上述内容可知
s
(
i
,
j
)
s(i,j)
s(i,j)就是
j
j
j点的重叠区间数。
对于结点
x
x
x,记以
x
x
x为根结点的子树中的最小端点值为
l
(
x
)
l(x)
l(x),最大端点值为
r
(
x
)
r(x)
r(x),为
x
x
x结点扩张一个额外信息
m
[
x
]
=
m
a
x
{
s
(
l
(
x
)
,
i
)
}
,
for i in
{
l
(
x
)
,
.
.
.
,
r
(
x
)
}
m[x]=max\{\text{s}(l(x),i)\}, \text{for i in}\{l(x),...,r(x)\}
m[x]=max{s(l(x),i)},for i in{l(x),...,r(x)},则
m
[
x
]
m[x]
m[x]就是以
x
x
x为根节点的树中最大重叠点的重叠数。
再在红黑树中通过分治找出对应的
m
[
x
]
m[x]
m[x],最大重叠点存在三种情况:
1.
1.
1.就是根节点
2.
2.
2.在左子树中
3.
3.
3.在右子树中,在左右子树中递归调用求
m
[
x
]
m[x]
m[x]的方法。
m
[
x
]
=
{
m
[
l
e
f
t
[
x
]
]
v
[
l
e
f
t
[
x
]
]
+
p
[
x
]
v
[
l
e
f
t
[
x
]
]
+
p
[
x
]
+
m
[
r
i
g
h
t
[
x
]
m[x]=\left\{ \begin{aligned} &m[left[x]]\\ &v[left[x]]+p[x]\\ &v[left[x]]+p[x]+m[right[x] \end{aligned} \right.
m[x]=⎩
⎨
⎧m[left[x]]v[left[x]]+p[x]v[left[x]]+p[x]+m[right[x]