是否同一棵二叉搜尋樹

來源:互聯網
上載者:User

標籤:struct   元素   不一致   turn   main   lse   判斷   lib   相等   

04-樹4 是否同一棵二叉搜尋樹 (25 分)給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空白的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能產生一樣的二叉搜尋樹。輸入格式:輸入包含若干組測試資料。每組資料的第1行給出兩個正整數N (≤10)和L,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出N個以空格分隔的正整數,作為初始插入序列。最後L行,每行給出N個插入的元素,屬於L個需要檢查的序列。簡單起見,我們保證每個插入序列都是1到N的一個排列。當讀到N為0時,標誌輸入結束,這組資料不要處理。輸出格式:對每一組需要檢查的序列,如果其產生的二叉搜尋樹跟對應的初始序列產生的一樣,輸出“Yes”,否則輸出“No”。輸入範例:4 23 1 4 23 4 1 23 2 4 12 12 11 20輸出範例:YesNoNo 
#include<cstdio>#include<stdlib.h>typedef struct TreeNode *Tree;struct TreeNode{    int data;    int flag;    Tree left,right;};Tree newNode(int v){    Tree T=(Tree)malloc(sizeof(struct TreeNode));    T->data=v;    T->left=T->right=NULL;    T->flag=0;    return T;}Tree insert(Tree& T,int v){    if(!T)T=newNode(v);    else{        if(v>T->data)T->right=insert(T->right,v);  //我遺漏T->right!!!          else if(v<T->data)T->left=insert(T->left,v);//T->left    }    return T;}Tree MakeTree(int n){    Tree T;    int i,v;    scanf("%d",&v);    T=newNode(v);          //先創造根結點    for( i=1;i<n;i++){        scanf("%d",&v);        T=insert(T,v);    }    return T;}int check(Tree T,int v){    if(T->flag){                //已經經過這個結點,那麼可以繼續檢查        if(T->data>v)return check(T->left,v);           else if(T->data<v)return check(T->right,v);        else return 0;    }    else {                    //沒有碰到過,如果值相等,那麼標記一下,說明對應符合。        if(T->data==v){            T->flag=1;            return 1;        }        else return 0;    //某次搜尋中遇到前面未出現的結點,不一致    }}int Judge(Tree T,int n){    int i,v,flag=0;    scanf("%d",&v);    if(v!=T->data)flag=1;        //根結點就不一樣,false    else T->flag=1;    for(int i=1;i<n;i++){        scanf("%d",&v);        if((!flag)&&(!check(T,v)))flag=1;    //之前是if(!check(T,v) return 0;這樣會導致輸入的後面的數字會轉移到下一組    }    if(flag)return 0;    else return 1;}void Reset(Tree T){   //清除標記    if(T->left)Reset(T->left);    if(T->right)Reset(T->right);    T->flag=0;}void FreeTree(Tree T){        //釋放樹    if(T->left)FreeTree(T->left);    if(T->right)FreeTree(T->right);    free(T);    }int main(){    int n,l;    Tree T;    scanf("%d",&n);    while(n){        scanf("%d",&l);        T=MakeTree(n);        for(int i=0;i<l;i++){            if(Judge(T,n))printf("Yes\n");            else printf("No\n");            Reset(T);        }        FreeTree(T);        scanf("%d",&n);  //後面再加一個scanf使得程式迴圈。  如果輸入0,那麼程式可以終止。    }        return 0;}

 

是否同一棵二叉搜尋樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.