void solve(int ALeft, int ARight, int TRoot)
{ // 初始调用为 solve(0, N-1, 0)
// ALeft是排序后的输入序列A的左端点数组下标,ARight是右端点数组下标
// TRoot是结果树序列的数组下标
n = ARight - ALeft + 1;
if (n==0) return;
L = GetLeftLength(n); // 计算出n个结点的树其左子树有多少个结点
T[TRoot] = A[ALeft + L];
LeftTRoot = TRoot * 2 + 1; // 找到左子树的根结点数组下标,注意:数组是从0开始,堆栈是从1开始
RightTRoot = LeftTRoot + 1; // 找到右子树的根结点数组下标
solve(ALeft, ALeft+L-1, LeftTRoot);
solve(ALeft+L+1, ARight, RightTRoot);
}
- 例如