是否同一棵二叉搜索树(c语言实现)
題目
是對(duì)于輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜索樹(shù)。
輸入格式:
輸入包含若干組測(cè)試數(shù)據(jù)。每組數(shù)據(jù)的第1行給出兩個(gè)正整數(shù)N (≤10)和L,分別是每個(gè)序列插入元素的個(gè)數(shù)和需要檢查的序列個(gè)數(shù)。第2行給出N個(gè)以空格分隔的正整數(shù),作為初始插入序列。最后L行,每行給出N個(gè)插入的元素,屬于L個(gè)需要檢查的序列。
簡(jiǎn)單起見(jiàn),我們保證每個(gè)插入序列都是1到N的一個(gè)排列。當(dāng)讀到N為0時(shí),標(biāo)志輸入結(jié)束,這組數(shù)據(jù)不要處理。
輸出格式:
對(duì)每一組需要檢查的序列,如果其生成的二叉搜索樹(shù)跟對(duì)應(yīng)的初始序列生成的一樣,輸出“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
幾種方法
根據(jù)兩個(gè)序列分別建樹(shù),再判別樹(shù)是否一樣
3124 vs 3412
根結(jié)點(diǎn)都是3
{1 2} 3 {4} vs {1 2} 3 {4}
一樣
3124 vs 3241
根結(jié)點(diǎn)都是3
{1 2} 3 {4} vs {2 1} 3 {4}
不一樣
求解思路
搜索樹(shù)表示
用鏈表表示
typedef struct TreeNode *Tree; struct TreeNode{int v; //結(jié)點(diǎn)信息Tree Left,Right; //兩個(gè)指針int flag; //有沒(méi)有被訪問(wèn)過(guò)的標(biāo)記 };程序框架搭建
int main() { int N, L, i;Tree T;//讀入N和Lscanf("%d", &N);while (N) {scanf("%d", &L);//根據(jù)第一行序列建樹(shù)TT = MakeTree(N);for (i=0; i<L; i++) {//依據(jù)樹(shù)T分別判別后面的L個(gè)序列是否能與T形成同一搜索樹(shù)并輸出結(jié)果if (Judge(T, N))printf("Yes\n");else printf("No\n");ResetT(T); //清除T中的標(biāo)記flag}FreeTree(T);scanf("%d", &N);}return 0; }如何建搜索樹(shù)
Tree MakeTree( int N ) { Tree T;int i, V;scanf("%d", &V);T = NewNode(V); //構(gòu)造第一個(gè)結(jié)點(diǎn)for (i=1; i<N; i++) { //讀入N-1個(gè)元素,插入T里面scanf("%d", &V);T = Insert(T, V); //不斷插入結(jié)點(diǎn)}return T; } //新建一個(gè)結(jié)點(diǎn) Tree NewNode( int V ) { Tree T = (Tree)malloc(sizeof(struct TreeNode));T->v = V; //v設(shè)為傳進(jìn)來(lái)的值T->Left = T->Right = NULL; //左右孩子設(shè)為0T->flag = 0; //flag設(shè)為0return T; } //遞歸插入結(jié)點(diǎn) Tree Insert( Tree T, int V ) {if ( !T ) //T如果為空,插入第一個(gè)結(jié)點(diǎn)T = NewNode(V);else {if ( V>T->v ) //要插入的數(shù)比第一個(gè)結(jié)點(diǎn)大,插在右邊T->Right = Insert( T->Right, V );else //否則插在左邊T->Left = Insert( T->Left, V );}return T; }如何判別
如何判別序列3 2 4 1是否 與樹(shù)T一致?
方法:在樹(shù)T中按順序搜索序列3 2 4 1中的每個(gè)數(shù)
如果每次搜索所經(jīng)過(guò)的結(jié)點(diǎn)在前面均出現(xiàn)過(guò),則一致
否則(某次搜索中遇到前面未出現(xiàn)的結(jié)點(diǎn)),則不一致
查找序列中的數(shù)在樹(shù)中的位置,如果在查找過(guò)程中發(fā)現(xiàn)某個(gè)數(shù)以前沒(méi)有碰到過(guò),就是不一致。例如上圖中T是3142,要判斷序列3241,序列第一個(gè)數(shù)3在T中的根結(jié)點(diǎn)找到,flag標(biāo)記為1,序列第二個(gè)數(shù)2在T中要經(jīng)過(guò)3-1-2找到,3之前碰到過(guò),而1之前沒(méi)碰到過(guò)(flag=0)。所以不一致。
提交結(jié)果
總結(jié)
以上是生活随笔為你收集整理的是否同一棵二叉搜索树(c语言实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树的同构(c语言静态链表实现)
- 下一篇: 【数据结构】二叉树的存储和遍历