日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5-4 是否同一棵二叉搜索树 (25分)

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5-4 是否同一棵二叉搜索树 (25分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://pta.patest.cn/pta/test/15/exam/4/question/712

這道題考察二叉搜索樹的實現,并且還需要一定的邏輯與算法,所以題目還是挺好的。

?

5-4?是否同一棵二叉搜索樹???(25分)

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

輸入格式:

輸入包含若干組測試數據。每組數據的第1行給出兩個正整數NN?(\le 1010)和LL,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出NN個以空格分隔的正整數,作為初始插入序列。最后LL行,每行給出NN個插入的元素,屬于LL個需要檢查的序列。

簡單起見,我們保證每個插入序列都是1到NN的一個排列。當讀到NN為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


這道題首先是需要建立一個二叉搜索樹,感覺雖然這個簡單,但把這個代碼寫的清晰,清爽,還是不太容易的,需要自己理清整個思路,然后才能寫好這個代碼。
然后就是這個搜索過程。給一個標記,然后建好一棵樹后,掃描這棵樹,如果用給定的測試來掃描這顆樹,在每個點出現之前的所有點,都被掃描過,則符合題意。
最后要注意,要復原整個標記值,否則會讓上一圈的循環對這一圈造成影響。

代碼如下(只有參考了ppt,才能寫出如此清爽的代碼~)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
using namespace std;

struct node
{
int num;
struct node * left;
struct node * right;
int flag;
};

typedef struct node * tree;

tree newnode(int n1)
{
tree t=(tree)malloc(sizeof(struct node));
t->num=n1;
t->left=NULL;
t->right=NULL;
t->flag=0;
return t;
}

tree Insert(tree t,int n)
{
if(!t)
t=newnode(n);
else
{
if(n>t->num)
{
t->right=Insert(t->right,n);
}
else
t->left=Insert(t->left,n);
}
return t;

}

tree maketree(int n)
{
tree t;
int this_num;
scanf("%d",&this_num);
t=newnode(this_num);
for(int i=1;i<n;i++)
{
scanf("%d",&this_num);
t=Insert(t,this_num);
}
return t;
}

int check(tree t,int v)
{
if(t->flag)
{
if(v>t->num)
{
return check(t->right,v);
}
else if(v<t->num)
{
return check(t->left,v);
}
}
else
{
if(v==t->num)
{
t->flag=1;
return 1;
}
else
return 0;
}
}

int judge(tree t,int n)
{
int flag=0;
int this_num;
scanf("%d",&this_num);
if(this_num!=t->num)
flag=1;
else
t->flag=1;
for(int i=1;i<n;i++)
{
scanf("%d",&this_num);
if(flag==0&&check(t,this_num)==0)
flag=1;
}
if(flag)
return 1;
else
return 0;
}

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,m;
tree t;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
t =maketree(n);
for(int i=1;i<=m;i++)
{
if(judge(t,n))
printf("No\n");
else
printf("Yes\n");
reset(t);

}

// free(t);

}
return 0;
}

?

?

轉載于:https://www.cnblogs.com/hyx0123/p/7268056.html

總結

以上是生活随笔為你收集整理的5-4 是否同一棵二叉搜索树 (25分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。