今天写数据结构题,有一个比较深刻的,记录在这里,方便日后查看翻阅。
题目:
一个深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问:
(1)各层的结点数目是多少?
(2)编号为i的结点的双亲结点(若存在)的编号是多少?
(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?
(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?
答:
(1)各层的结点数目是多少?
第一层:
1
1
1
第二层:
k
k
k
第三层:
k
∗
k
k*k
k∗k
第四层:
k
∗
k
∗
k
k*k*k
k∗k∗k
第n层:
k
n
−
1
k^{ n-1}
kn−1
(2)编号为i的结点的双亲结点(若存在)的编号是多少?
我先画了一个满三叉树图,方便思考(并不是这道题就是三叉树,题目给的是满k叉树,我只是为了方便才选择三叉树的)
假设i的位置如上,j是i的第一个子节点。
i 的前面有(i-1)个节点,每一个节点有k 个子节点,
所以j 前面有((i-1)*k)+1 个节点,为什么要加1呢,
因为(i-1)*k 没有包括根节点,
所以j 前面的节点再加一,((i-1)*k)+2 就是j 节点的编号。
( ( i − 1 ) ∗ k ) + 2 ((i-1)*k)+2 ((i−1)∗k)+2
衍生问题,如果问的是i的第k个孩子的编号怎么办?
第一个孩子
(
i
−
1
)
∗
k
)
+
2
(i-1)*k)+2
(i−1)∗k)+2
那么第k个孩子
(
i
−
1
)
∗
k
)
+
2
+
k
−
1
(i-1)*k)+2 + k -1
(i−1)∗k)+2+k−1
(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?
再画一个图,把i和j的位置换一下
这次就是求i 的父节点j 的编号,我只会使用数学的推算方法,联想不出来这个题。
因为i是j子节点,所以可以用j 来求i 的编号,
i
=
(
(
j
−
1
)
∗
k
)
+
2
i=((j-1)*k)+2
i=((j−1)∗k)+2
i
−
2
=
(
j
−
1
)
∗
k
i-2=(j-1)*k
i−2=(j−1)∗k
(
i
−
2
)
/
k
=
j
−
1
(i-2)/k=j-1
(i−2)/k=j−1
j
=
(
(
i
−
2
)
/
k
)
+
1
j=((i-2)/k)+1
j=((i−2)/k)+1
第三题就是通过第二题得到的结果,逆向推理得到的结果,这是目前我会的唯一方法。
(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?
图中红色的就是没有右兄弟,除了红色的节点,其他的节点都有右兄弟
通过图片可以发现,只要i 不是每个节点的最右节点,
换个说法,只要i 不是双亲的第k个孩子就有右兄弟
对于任意的节点p ,其k 个子节点的编号是p*k+1
则有:
i
!
=
p
∗
k
+
1
i!= p*k+1
i!=p∗k+1
i
−
1
!
=
p
∗
k
i-1 != p*k
i−1!=p∗k
最后结果可以写成:
(
i
−
1
)
%
k
!
=
0
(i-1)\% k !=0
(i−1)%k!=0
其实就是保证当前节点减一不是k的倍数,就可以保证该节点是有右兄弟的。
这道题我也是在网上看解析看了好久看懂的,但是网上的没有系统的讲解这个问题的,索性我自己总结下来,方便日后自己复习,或者帮助其他人学习这个问题。
希望对你有帮助。