• <var id="czqhk"></var>
  • <label id="czqhk"><rt id="czqhk"></rt></label>
  • <code id="czqhk"><label id="czqhk"></label></code>

    2010澳門特別行政區分析數據庫的考試題目加強 下載本文

    1、兩棵空二叉樹或僅有根結點的二叉樹相似;對非空二叉樹,可判左右子樹是否相似,采用遞歸算法。

    int Similar(BiTree p,q) //判斷二叉樹p和q是否相似 {if(p==null && q==null) return (1); else if(!p && q || p && !q) return (0);

    else return(Similar(p->lchild,q->lchild) && Similar(p->rchild,q->rchild)) }//結束Similar

    2、證明由二叉樹的中序序列和后序序列,也可以唯一確定一棵二叉樹。 29. ①試找出滿足下列條件的二叉樹

    1)先序序列與后序序列相同 2)中序序列與后序序列相同 3)先序序列與中序序列相同 4)中序序列與層次遍歷序列相同

    3、二叉樹的層次遍歷序列的第一個結點是二叉樹的根。實際上,層次遍歷序列中的每個結點都是“局部根”。確定根后,到二叉樹的中序序列中,查到該結點,該結點將二叉樹分為“左根右”三部分。若左、右子樹均有,則層次序列根結點的后面應是左右子樹的根;若中序序列中只有左子樹或只有右子樹,則在層次序列的根結點后也只有左子樹的根或右子樹的根。這樣,定義一個全局變量指針R,指向層次序列待處理元素。算法中先處理根結點,將根結點和左右子女的信息入隊列。然后,在隊列不空的條件下,循環處理二叉樹的結點。隊列中元素的數據結構定義如下: typedef struct

    { int lvl; //層次序列指針,總是指向當前“根結點”在層次序列中的位置 int l,h; //中序序列的下上界

    int f; //層次序列中當前“根結點”的雙親結點的指針 int lr; // 1—雙親的左子樹 2—雙親的右子樹 }qnode;

    BiTree Creat(datatype in[],level[],int n)

    //由二叉樹的層次序列level[n]和中序序列in[n]生成二叉樹。 n是二叉樹的結點數 {if (n<1) {printf(“參數錯誤\\n”); exit(0);}

    qnode s,Q[]; //Q是元素為qnode類型的隊列,容量足夠大 init(Q); int R=0; //R是層次序列指針,指向當前待處理的結點 BiTree p=(BiTree)malloc(sizeof(BiNode)); //生成根結點 p->data=level[0]; p->lchild=null; p->rchild=null; //填寫該結點數據

    for (i=0; i

    if (i==0) //根結點無左子樹,遍歷序列的1—n-1是右子樹 {p->lchild=null;

    s.lvl=++R; s.l=i+1; s.h=n-1; s.f=p; s.lr=2; enqueue(Q,s); }

    else if (i==n-1) //根結點無右子樹,遍歷序列的1—n-1是左子樹 {p->rchild=null;

    s.lvl=++R; s.l=1; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s); }

    else //根結點有左子樹和右子樹

    {s.lvl=++R; s.l=0; s.h=i-1; s.f=p; s.lr=1;enqueue(Q,s);//左子樹有關信息入隊列 s.lvl=++R; s.l=i+1;s.h=n-1;s.f=p; s.lr=2;enqueue(Q,s);//右子樹有關信息入隊列 }

    while (!empty(Q)) //當隊列不空,進行循環,構造二叉樹的左右子樹 { s=delqueue(Q); father=s.f; for (i=s.l; i<=s.h; i++)

    if (in[i]==level[s.lvl]) break;

    p=(bitreptr)malloc(sizeof(binode)); //申請結點空間

    p->data=level[s.lvl]; p->lchild=null; p->rchild=null; //填寫該結點數據 if (s.lr==1) father->lchild=p;

    else father->rchild=p; //讓雙親的子女指針指向該結點 if (i==s.l)

    {p->lchild=null; //處理無左子女

    s.lvl=++R; s.l=i+1; s.f=p; s.lr=2; enqueue(Q,s); }

    else if (i==s.h)

    {p->rchild=null; //處理無右子女

    s.lvl=++R; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s); }

    else{s.lvl=++R; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s);//左子樹有關信息入隊列

    s.lvl=++R; s.l=i+1; s.f=p; s.lr=2; enqueue(Q,s); //右子樹有關信息入隊列 }

    }//結束while (!empty(Q)) return(p); }//算法結束

    4、證明由二叉樹的中序序列和后序序列,也可以唯一確定一棵二叉樹。 當n=1時,只有一個根結點,由中序序列和后序序列可以確定這棵二叉樹。 設當n=m-1時結論成立,現證明當n=m時結論成立。 設中序序列為S1,S2,?,Sm,后序序列是P1,P2,?,Pm。因后序序列最后一個元素Pm是根,則在中序序列中可找到與Pm相等的結點(設二叉樹中各結點互不相同)Si(1≤i≤m),因中序序列是由中序遍歷而得,所以Si是根結點,S1,S2,?,Si-1是左子樹的中序序列,而Si+1,Si+2,?,Sm是右子樹的中序序列。

    若i=1,則S1是根,這時二叉樹的左子樹為空,右子樹的結點數是m-1,則{S2,S3,?,Sm}和{P1,P2,?,Pm-1}可以唯一確定右子樹,從而也確定了二叉樹。 若i=m,則Sm是根,這時二叉樹的右子樹為空,左子樹的結點數是m-1,則{S1,S2,?,Sm-1}和{P1,P2,?,Pm-1}唯一確定左子樹,從而也確定了二叉樹。

    最后,當1

    5、本題要求建立有序的循環鏈表。從頭到尾掃描數組A,取出A[i](0<=i

    //由含n個數據的數組A生成循環鏈表,要求鏈表有序并且無值重復結點 {LinkedList h;

    h=(LinkedList)malloc(sizeof(LNode));//申請結點 h->next=h; //形成空循環鏈表 for(i=0;inext;

    while(p!=h && p->data

    {pre=p; p=p->next;} //查找A[i]的插入位置

    if(p==h || p->data!=A[i]) //重復數據不再輸入 {s=(LinkedList)malloc(sizeof(LNode));

    s->data=A[i]; pre->next=s; s->next=p;//將結點s鏈入鏈表中 }

    }//for

    return(h); }算法結束

    6、數組A和B的元素分別有序,欲將兩數組合并到C數組,使C仍有序,應將A和B拷貝到C,只要注意A和B數組指針的使用,以及正確處理一數組讀完數據后將另一數組余下元素復制到C中即可。

    void union(int A[],B[],C[],m,n)

    //整型數組A和B各有m和n個元素,前者遞增有序,后者遞減有序,本算法將A和B歸并為遞增有序的數組C。

    {i=0; j=n-1; k=0;// i,j,k分別是數組A,B和C的下標,因用C描述,下標從0開始 while(i=0)

    if(a[i]=0) c[k++]=b[j--]; }算法結束

    4、要求二叉樹按二叉鏈表形式存儲。15分 (1)寫一個建立二叉樹的算法。(2)寫一個判別給定的二叉樹是否是完全二叉樹的算法。 BiTree Creat() //建立二叉樹的二叉鏈表形式的存儲結構 {ElemType x;BiTree bt;

    scanf(“%d”,&x); //本題假定結點數據域為整型 if(x==0) bt=null; else if(x>0)

    {bt=(BiNode *)malloc(sizeof(BiNode));

    bt->data=x; bt->lchild=creat(); bt->rchild=creat(); }

    else error(“輸入錯誤”); return(bt);

    }//結束 BiTree

    int JudgeComplete(BiTree bt) //判斷二叉樹是否是完全二叉樹,如是,返回1,否則,返回0

    {int tag=0; BiTree p=bt, Q[]; // Q是隊列,元素是二叉樹結點指針,容量足夠大 if(p==null) return (1);

    QueueInit(Q); QueueIn(Q,p); //初始化隊列,根結點指針入隊 while (!QueueEmpty(Q))

    {p=QueueOut(Q); //出隊

    if (p->lchild && !tag) QueueIn(Q,p->lchild); //左子女入隊

    else {if (p->lchild) return 0; //前邊已有結點為空,本結點不空 else tag=1; //首次出現結點為空 if (p->rchild && !tag) QueueIn(Q,p->rchild); //右子女入隊 else if (p->rchild) return 0; else tag=1; } //while

    return 1; } //JudgeComplete

    7、設從鍵盤輸入一整數的序列:a1, a2, a3,?,an,試編寫算法實現:用棧結構存儲輸入的整數,當ai≠-1時,將ai進棧;當ai=-1時,輸出棧頂整數并出棧。算法應對異常情況(入棧滿等)給出相應的信息。

    設有一個背包可以放入的物品重量為S,現有n件物品,重量分別為W1,W2,...,Wn。問能否從這n件物品中選擇若干件放入背包,使得放入的重量之和正好是S。設布爾函數Knap(S,n)表示背包問題的解,Wi(i=1,2,...,n)均為正整數,并已順序存儲地在數組W中。請在下列算法的下劃線處填空,使其正確求解背包問題。 Knap(S,n) 若S=0

    則Knap←true

    否則若(S<0)或(S>0且n<1) 則Knap←false

    否則若Knap(1) , _=true 則print(W[n]);Knap ←true 否則 Knap←Knap(2) _ , _

    設有一個順序棧S,元素s1, s2, s3, s4, s5, s6依次進棧,如果6個元素的出棧順序為s2, s3, s4, s6, s5, s1,則順序棧的容量至少應為多少?畫出具體進棧、出棧過程。

    假定采用帶頭結點的單鏈表保存單詞,當兩個單詞有相同的后綴時,則可共享相同的后綴存儲空間。例如:

    設str1和str2是分別指向兩個單詞的頭結點,請設計一個盡可能的高效算法,找出兩個單詞共同后綴的起始位置,分析算法時間復雜度。

    將n(n>1)個整數存放到一維數組R中。設計一個盡可能高效(時間、空間)的算 法,將R中保存的序列循環左移p(0





    免费的中国黄网站大全-恋母情结浩君全彩漫画-无翼乌之漫画漫画大全-大飞网