begin
for i:=Right.NodeCount+1 to (1 shl h)-1 do
Right.NodeList[i]:=&;
Right.NodeCount:=(1 shl h)-1;
end;
{若Right的高度小于h,则将Right补成高度为h-1的满二叉树}
{=======
对于Left中编号为i的结点v,它在新树T中的编号为2h
+i,其中h=
log2(i+1)-1
;对于Right中编号为i的结点v,它在新树T中的编号为2h+1+i,其中h=
log2(i+1)-1
。
=======}
for
i:=1 to Left.NodeCount do
T.NodeList[(1 shl cal(i))+i]:=Left.NodeList[i];
{计算出Left中编号为i的结点在T中的位置,将其复制到T中}
for
i:=1 to Right.NodeCount do
T.NodeList[(1 shl (cal(i)+1))+i]:=Right.NodeList[i];
{计算出Right中编号为i的结点在T中的位置,将其复制到T中}
end;
其中cal(i)用来计算含有i个结点的近似满二叉树T的高度,cal(i)=
log2(i+1)-1
,可以实现如下:
Function
cal(i:integer;):integer;
var
x:real;
begin
x:=log2(i+1)-1;
if
x=int(x) then return(x) else return(int(x)+1);
{向上取整}
end;
其中log2(n)计算实数n以2为底的对数。