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


給定一個插入序列就可以唯一確定一棵二叉搜索樹。然而,一棵給定的二叉搜索樹卻可以由多種不同的插入序列得到。例如分別按照序列{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");
    }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM