9.25 FUNC SqSearch(s:SqList; k:KeyType):integer;

   (监视哨设在降序顺序表高下标端,顺序查找关键字为K的数据元素。若存在,)

{则返回其在顺序表中的位置,否则,返回0}

   r[n+1].key:=K; i:=1;

   WHILE r[i].key>K DO i:=i+1;

   IF r[I].key=K THEN return(i MOD (n+1))

           ELSE return(0)

查找过程的判定树是单支树。

查找成功的平均查找长度为

ASL=PICI =1/n*i  = 1/2*(n+1)

查找不成功的平均查找长度为  ASL=1/(n+1)(i+(n+1))=(n+2)/2

9.26 FUNC BinSearch(s:SqList;low,high:integer;K:KeyType):integer;

{在有序的顺序表ss.elem[low..high]中递归地折半查找关键字为K的数}

{据元素,若存在,则返回其在有序顺序表中的位置,否则,返回0found}

{全程变量,调用时初值是false,返回后判其值,如未变,则未查到)

   IF (low<=high) AND NOT FOUND THEN

[ mid:=(low+high) DIV 2;

       IF s.elem[mid].key<K

THEN BinSearch:=BinSearch(s,mid+1,high,K)

          ELSE IF s.elem[mid].key>K

THEN BinSearch:=BinSearch(s,low,mid-1,K)

                    ELSE [ BinSearch:= mid; found:=true]

      ]

 


9.31 FUNC BiSortTree(t:BiTree; VAR pre: BiTree ):Boolean;

  (二叉排序树的判定。Pre为指向当前访问的结点的前驱结点的指针,起初值)

  (为NILFALG是标志,初值为true

   IF (t<>NIL) AND flag THEN

      [  flag:=BiSortTree(t^.lchild,pre)

       IF pre=NIL

  THEN  pre:=t

    ELSE IF pre^.data > t^.data  THEN flag:=false

          ELSE pre:=t;       

IF flag THEN flag:=BiSortTree(t^.rchild,pre)

      ]

9.33 PROC OrderedOut(t:BiTree; x:KeyType );

  (递归地从大到小输出二叉排序树t中所有关键字不小于x的元素。)

  {found是全程变量,调用本过程时初值是false}

IF NOT found THEN

    [IF t^.rchild<>NIL THEN OrderedOut(t^.rchild,x)

  IF t^.data >=x  THEN write(t^.data)  ELSE  found:=true; 

IF NOT found  AND (t^.lchild<>NIL) THEN  OrderedOut(t^.lchild,x)

   ]


 

**** PROC Insert( VAR t:BiTree; K:KeyType)     {增加题}

     {在二叉排序树t上插入关键字为K的结点。 算法思想是首先查找,若有}

{,foundtrue,则不必插入;否则,在适当位置插入之。Found初值false}

     IF NOT found THEN

      IF t=NIL

         THEN  [new(s); s^.data:=K; s^,lchild:=s^.rchild:=NIL;t:=s]

         ELSE IF t^.data=K

 THEN found:=true

                 ELSE IF K<t^.data

THEN IF t^.lchild=NIL

THEN [new(s); s^.data:=K;

                                       s^,lchild:=s^.rchild:=NIL;

                                       t^.lchild:=s  

]

                                ELSE  Insert(t^.lchild, K)

ELSE IF t^.rchild=NIL

 THEN [new(s); s^.data:=K;

                                        s^,lchild:=s^.rchild:=NIL;

                                         t^.rchild:=s

    ]

                                  ELSE  Insert(t^.rchild, K)

{ END OF 插入关键字为K 的结点}


**** PROC Delete( VAR t:BiTree; K:KeyType)      {增加题}

{在二叉排序树t上删除关键字为K的结点. 算法思想是首先查找,}

{若有,则删除,q是当前结点p的双亲结点 }

p:=t; q:=NIL; found:=false;

WHILE (p<>NIL) AND NOT found DO  {查找关键字为K的结点}

  IF p^.data=K

THEN found:=true

    ELSE IF K<p^.data

THEN  [q:=p; p:=p^.lchild]

            ELSE  [q:=p; p:=p^.rchild]

IF p=NIL

THEN write(‘无关键字为K的结点’)

  ELSE IF p^.lchild=NIL  {关键字为K的结点无左子女}

          THEN IF q=NIL THEN t:=p^.rchild {关键字为K的结点是根}

                         ELSE IF q^.lchild=p THEN q^.lchild:=p^.rchild

                                           ELSE q^.rchild:=p^.rchild

          ELSE[ {关键字为K的结点有左子树,查左子树在中序遍历下}

{的最后结点,以便将被删结点的右子树作为该结点的}

{右子树。最后删除关键字为K的结点}

                r:=p^.lchild;

                WHILE r^.rchild<>NIL DO r:=r^.rchild

 r^.rchild:=p^.rchild {链入关键字为K的结点的右子女}    

                 IF q=NIL THEN t:=p^.lchild {被删结点是根}

                         ELSE IF q^.lchild=p THEN q^.lchild:=p^.lchild

                                           ELSE q^.rchild:=p^.lchild

                ]