原文在这儿,由于原作者大佬的Latex公式没有渲染,且有点小错误,看起来难受,我就转写到这儿,顺便改了改。
其输入用例,就是用一个数组来表述二叉树(即用二叉树的顺序存储来表述输入用例),如下:
看图就易知: 如果(一个)父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2。
如果(一个)父节点在第 k k k层的第 m m m个节点, ( m ∈ [ 1 , 2 k − 1 ] ) (m \in [1,2^{k-1}]) (m∈[1,2k−1])。则其左子节点是第 k + 1 k+1 k+1层的第 2 m − 1 2m-1 2m−1个节点;其右子节点是第 k + 1 k+1 k+1层的第 2 m 2m 2m个节点。(较抽象,画个四层二叉树图就知道了)
则该父节点在数组中的索引下标(利用满二叉树的第k层的节点数为
2
k
−
1
2^{k-1}
2k−1的性质来计算):
i
n
d
e
x
f
a
t
h
e
r
=
(
∑
i
=
0
i
=
k
−
2
2
i
+
m
)
−
1
=
(
2
k
−
1
−
1
+
m
)
−
1
=
2
k
−
1
+
m
−
2
index_{father}=(\sum_{i=0}^{i=k-2}2^i+m)-1=(2^{k-1}-1+m)-1=2^{k-1}+m-2
indexfather=(i=0∑i=k−22i+m)−1=(2k−1−1+m)−1=2k−1+m−2
或者利用 高度(层数)为k的满二叉树的总节点数为
2
k
−
1
2^{k}-1
2k−1的性质来计算:
i
n
d
e
x
f
a
t
h
e
r
=
(
2
k
−
1
−
1
+
m
)
−
1
=
2
k
−
1
+
m
−
2
index_{father}=(2^{k-1}-1+m)-1=2^{k-1}+m-2
indexfather=(2k−1−1+m)−1=2k−1+m−2
其左孩子节点在数组的索引下标:
i
n
d
e
x
l
e
f
t
=
(
∑
i
=
0
i
=
k
−
1
2
i
+
2
∗
m
−
1
)
−
1
=
2
k
+
2
m
−
3
index_{left}=(\sum_{i=0}^{i=k-1}2^i+2*m-1)-1=2^{k}+2m-3
indexleft=(i=0∑i=k−12i+2∗m−1)−1=2k+2m−3
或直接
i
n
d
e
x
l
e
f
t
=
(
2
k
−
1
+
2
m
−
1
)
−
1
=
2
k
+
2
m
−
3
index_{left}=(2^k-1+2m-1)-1=2^k+2m-3
indexleft=(2k−1+2m−1)−1=2k+2m−3
其右孩子节点在数组的索引下标: i n d e x r i g h t = ( 2 k − 1 + 2 m ) − 1 = 2 k + 2 m − 2 index_{right}=(2^k-1+2m)-1=2^k+2m-2 indexright=(2k−1+2m)−1=2k+2m−2
验证一下:
故左孩子的下表为
i
n
d
e
x
l
e
f
t
=
i
n
d
e
x
f
a
t
h
e
r
×
2
+
1
index_{left}=index_{father}\times2+1
indexleft=indexfather×2+1,同理可得到右子孩子的索引关系:
i
n
d
e
x
r
i
g
h
t
=
i
n
d
e
x
r
i
g
h
t
×
2
+
2
index_{right}=index_{right}\times2+2
indexright=indexright×2+2。也可以直接在左子孩子的基础上+1。