題目:給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。
輸入格式:
輸入包含若干組測試資料。每組資料的第1行給出兩個正整數n (≤10)和l,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出n個以空格分隔的正整數,作為初始插入序列。最後l行,每行給出n個插入的元素,屬於l個需要檢查的序列。
簡單起見,我們保證每個插入序列都是1到n的乙個排列。當讀到n為0時,標誌輸入結束,這組資料不要處理。
輸出格式:
對每一組需要檢查的序列,如果其生成的二叉搜尋樹跟對應的初始序列生成的一樣,輸出「yes」,否則輸出「no」。
輸入樣例:
4 23 1 4 2
3 4 1 2
3 2 4 1
2 12 1
1 20
輸出樣例:
yesno
no首先要解決幾個問題:
接收輸入部分: 二叉搜尋樹的表示和建樹 。
處理部分: 判斷是否為同一顆樹
輸出用傳統的結構體來表示一棵二叉樹:
/*二叉樹的表示*/
struct treenode
;typedef
struct treenode* tree;
tree t;
建樹分成3個函式 (這裡從無到有的過程我覺得挺抽象的)
1.建立節點將讀入的資料報裹進去newnode函式
2.以第乙個建的節點為根節點,新產生的節點和根節點通過insert函式建立邏輯(子樹掛到二叉樹上)
3.maketree函式實現的功能:
建立第乙個根節點 、將兩個函式的功能整合到乙個大函式裡 。
(不會形容,意會 )
tree maketree
(int n)
return t;
}
newnode函式:
/*將資料報裹入乙個結點*/
tree newnode
(int v)
insert插入 函式 –
tree insert
(tree t,
int v)
else
else
}return t;
}
/*判斷*/
intjudgetree
(tree t,
int n)
if(flag)
return0;
else
return1;
}
【注意】 :讀入比較序列的時候:一共有n個數字在緩衝區裡
如果沒有讀完就退出,留在緩衝區的數字就會成為下一次讀取的數字 ,就會導致程式失敗,這也是為什麼設定了標誌量flag 的原因–
當發現不同結構的時候,不能直接結束函式 , 要繼續讀入!
check函式的基本思想就是二叉搜尋樹的基本操作–搜尋
int
check
(tree t,
int v)
else
if(v < t->data)
check
(t->left, v)
;else
return0;
}else
//如果不是,先判斷是不是就是要查詢的元素。
else
return0;
}}
沒有什麼好說的了。
剩下的處理函式還有 :
1.當進行下一組樹和比較序列的讀入和比較時,要先將樹節點的flag域重置為0
2.程式結束後,將申請的空間釋放掉(二叉樹的銷毀)
/*重置flag域*/
void
reset
(tree t)
/*二叉樹銷毀*/
void
freetree
(tree t)
主函式如下:
/*注意根據題目要求讀入*/
intmain()
freetree
(t);
scanf
("%d"
,&n);}
}
完整程式如下:
#include
#include
struct treenode
;typedef
struct treenode* tree;
tree t;
tree newnode
(int v)
tree insert
(tree t,
int v)
else
else
}return t;
}tree maketree
(int n)
return t;
}int
check
(tree t,
int v)
else
if(v < t->data)
check
(t->left, v)
;else
return0;
}else
else
return0;
}}intjudgetree
(tree t,
int n)
if(flag)
return0;
else
return1;
}void
reset
(tree t)
void
freetree
(tree t)
intmain()
freetree
(t);
scanf
("%d"
,&n);}
}
PTA 7 4 是否是同一棵二叉搜尋樹
總體思路 採用先序遍歷的方式來進行比較即可。靜態樹 題目描述 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸...
PTA7 4 是否同一棵二叉搜尋樹 25分
給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。每組資料的第1行給出兩個正整數n 10 ...
pta7 4 是否同一棵二叉搜尋樹 25分
給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。每組資料的第1行給出兩個正整數n 10 ...