1. 程式人生 > >7-7 是否同一棵二叉搜索樹(25 分)

7-7 是否同一棵二叉搜索樹(25 分)

urn htm gin ems %d 生成 ng- -i height

給定一個插入序列就可以唯一確定一棵二叉搜索樹。然而,一棵給定的二叉搜索樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜索樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜索樹。

輸入格式:

輸入包含若幹組測試數據。每組數據的第1行給出兩個正整數N (10)和L,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出N個以空格分隔的正整數,作為初始插入序列。最後L行,每行給出N個插入的元素,屬於L個需要檢查的序列。

簡單起見,我們保證每個插入序列都是1到N的一個排列。當讀到N為0時,標誌輸入結束,這組數據不要處理。

輸出格式:

對每一組需要檢查的序列,如果其生成的二叉搜索樹跟對應的初始序列生成的一樣,輸出“Yes”,否則輸出“No”。

輸入樣例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

輸出樣例:

Yes
No
No


代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
void add(int *p,int k,int d)
{
    if
(p[k] == -1)p[k] = d; else if(p[k] > d)add(p,k*2,d); else add(p,k*2+1,d); } int comp(int *a,int *b) { int c = 0; for(int i = 0;a[i] == b[i];i ++) { if(a[i] != -1)c ++; if(c == n)break; } if(c != n)return 0; return 1; } int main() {
int a[41],b[41]; int l,d; while(~scanf("%d",&n)&&n){ scanf("%d",&l); memset(a,-1,sizeof(a)); for(int i = 0;i < n;i ++) { scanf("%d",&d); add(a,1,d); } while(l --) { memset(b,-1,sizeof(b)); for(int i = 0;i < n;i ++) { scanf("%d",&d); add(b,1,d); } if(comp(a,b))printf("Yes\n"); else printf("No\n"); } } }

7-7 是否同一棵二叉搜索樹(25 分)