12.2-9 设T为一棵其关键字均不相同的二叉查找树,并设x为一个叶子节点,y是其父节点。证明:key[y]或者是T中大于key[x]的最小关键字,或者是T中小于key[x]的最大关键字。
若x是y的左节点,y是x的后继,此时key[y]是大于key[x]的最小关键字;若x是y的右节点,y是x的前驱,此时key[y]是小于key[x]的最大关键字。
12.4-2 请描述这样的一棵二叉查找树:其中每个节点的平均深度为Θ(lgn),但树的深度是ω(lgn)。对于一棵含n个节点的二叉查找数,如果其中每个节点的平均深度为Θ(lgn),给出其高度的一个渐进上界。
方法来自stackoverflow的这个帖子。思路:对于一个二叉查找树,使其平均高度最低,但高度最大的方法是,使这棵树成为一个完美二叉树但有一个尾巴,这个尾巴是一条单链。
由于是求渐进界,我们可以做一些假设,完美二叉树部分总结点数为2k-1,这部分路径总长度为2*1 + 4*2 + 4*3 + … + 2k-1* k ≈ k*2k; 尾巴长度为f(n),这段总长度为k+(k+1)+……+(k+f(n)-1) =
f2(n)/2 – f(n)/2 + k*f(n)。二叉树路径总长度为 k*2k + f2(n)/2 – f(n)/2 + k*f(n)。又2k – 1 + f(n) = n,所以有 2k≈ n – f(n), k ≈ lg(n – f(n))。省略一些低阶项,二叉树平均高度为:
((lg[n-f(n)]*(n-f(n)] + f2(n))/n,当f(n) = O(1) 或 f(n) = O(√nlgn)时,平均高度为Θ(lgn)。所以高度上界为O(√nlgn)。
12-3 随机构造的二叉查找树中节点的平均深度
a) 定义
b) 由 d(x, TL) = d(x, T) – 1 和 d(x, TR) = d(x, T) – 1 即可得到结论。
c) 随机构造的二叉树,按照左子树节点个数可以分为n类(0 – n-1),每类子树的平均总路径长度为P(i) + P(n-i-1) + n – 1。n 类的平均总长度为 \frac{1}{n}\sum_{i=0}^{n-1}P(i)+P(n-1-i)+n-1
d) c)中公式可写为
P(n) = \frac{1}{n}\sum_{i=0}^{n-1}P(i) + \frac{1}{n}\sum_{i=0}^{n-1}P(n-i-1) + \Theta(n) = \frac{2}{n}\sum_{k=0}^{n-1}P(k) + \Theta(n)\nonumber
e) 过程有点儿烦,思路:1. 代换法,令P(k) = ak\lg k + b。2. 证\sum_{i=2}^{n-1}k\lgk \le \frac{1}{2}n^{2}\lgn – \frac{1}{8}n^{2},方法:令 \sum_{i=2}^{n-1}k\lg k = \sum_{i=2}^{\lceil n/2\rceil-1}k\lg k + \sum_{i=\lceil n/2\rceil}^{n-1}k\lg k 展开即可。
12-4 不同二叉树数目
a) 假设左子树有k个顶点,则右子树有n-1-k个顶点。不同左子树数目为bk,不同右子树数目为bn-1-k,此类二叉树数目为bibn-k-1。不同二叉树数目为b_{n} = \sum_{k=0}^{n-1}b_{k}b_{n-k-1}
b)
\begin{align}B^2(x) = \sum_{n=0}^{\infty}b_{n}x^{n} * \sum_{n=0}^{\infty} b_{n}x^{n} =\sum_{n=1}^{\infty}\sum_{i+j = n}b_{i}b_{j}x^{n-1} + b_{0} = \sum_{n=1}^{\infty}b_{n}x^{n-1} + b_{0} \nonumber\\= \sum_{n=0}^{\infty}b_{n}x^{n}\nonumber\end{align}
c) 输入公式太烦了……
d) stirling 公式