2023年寧夏回族自治區資料總結高階

2021-12-22 16:52:58 字數 1673 閱讀 3211

1、證明由二叉樹的中序序列和後序序列,也可以唯一確定一棵二叉樹。

當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,則和可以唯一確定右子樹,從而也確定了二叉樹。

若i=m,則sm是根,這時二叉樹的右子樹為空,左子樹的結點數是m-1,則和唯一確定左子樹,從而也確定了二叉樹。

最後,當1可唯一確定二叉樹的左子樹,由和

可唯一確定二叉樹的右子樹 。

2、根據二叉排序樹中序遍歷所得結點值為增序的性質,在遍歷中將當前遍歷結點與其前驅結點值比較,即可得出結論,為此設全域性指標變數pre(初值為null)和全域性變數flag,初值為true。若非二叉排序樹,則置flag為false。

#define true 1

#define false 0

typedef struct node

*btree;

void judgebst(btree t,int flag)

// 判斷二叉樹是否是二叉排序樹,本演算法結束後,在呼叫程式中由flag得出結論。

//不是完全二叉樹

judgebst (t->rlink,flag);// 中序遍歷右子樹

}//judgebst演算法結束

3、我們用l代表最長平台的長度,用k指示最長平台在陣列b中的起始位置(下標)。用j記住區域性平台的起始位置,用i指示掃瞄b陣列的下標,i從0開始,依次和後續元素比較,若區域性平台長度(i-j)大於l時,則修改最長平台的長度k(l=i-j)和其在b中的起始位置(k=j),直到b陣列結束,l即為所求。

void platform (int b[ ], int n)

//求具有n個元素的整型陣列b中最長平台的長度。

//區域性最長平台

i++; j=i新平台起點

printf(「最長平台長度%d,在b陣列中起始下標為%d」,l,k);

}// platform

4、矩陣中元素按行和按列都已排序,要求查詢時間複雜度為o(m+n),因此不能採用常規的二層迴圈的查詢。可以先從右上角(i=a,j=d)元素與x比較,只有三種情況:一是a[i,j]>x, 這情況下向j 小的方向繼續查詢;二是a[i,j]void search(datatype a[ ][ ], int a,b,c,d, datatype x)

//n*m矩陣a,行下標從a到b,列下標從c到d,本演算法查詢x是否在矩陣a中.

else if (a[i][j]>x) j--; else i++;

if(flag) printf(「a[%d][%d]=%d」,i,j,x假定x為整型.

else printf(「矩陣a中無%d 元素」,x);

}演算法search結束。

[演算法討論]演算法中查詢x的路線從右上角開始,向下(當x>a[i,j])或向左(當x

2023年寧夏回族自治區資料總結摘要

1 define maxsize 棧空間容量 void inouts int s maxsize s是元素為整數的棧,本演算法進行入棧和退棧操作。else s top x x入棧 else 讀入的整數等於 1時退棧。else printf 出棧元素是 d n s top 演算法結 2 給出折半查詢的...

2023年寧夏回族自治區資料總結綱要

1 後序遍歷最後訪問根結點,即在遞迴演算法中,根是壓在棧底的。採用後序非遞迴演算法,棧中存放二叉樹結點的指標,當訪問到某結點時,棧中所有元素均為該結點的祖先。本題要找p和q 的最近共同祖先結點r 不失一般性,設p在q的左邊。後序遍歷必然先遍歷到結點p,棧中元素均為p的祖先。將棧拷入另一輔助棧中。再繼...

2023年寧夏回族自治區資料總結大綱

1 給定n個村莊之間的交通圖,若村莊i和j之間有道路,則將頂點i和j用邊連線,邊上的wij表示這條道路的長度,現在要從這n個村莊中選擇乙個村莊建一所醫院,問這所醫院應建在哪個村莊,才能使離醫院最遠的村莊到醫院的路程最短?試設計乙個解答上述問題的演算法,並應用該演算法解答如圖所示的例項。20分 voi...