一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出yes
,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出no
。
7
8 6 5 7 10 8 11
yes
5 7 6 8 11 10 8
7
8 10 11 8 6 7 5
yes
11 8 10 7 5 6 8
7
8 6 8 5 10 9 11
no
思路:首先是建樹和檢查,我使用容器進行迭代建樹,假設題目給出來的是正確的先序遍歷或者先序遍歷的映象遍歷,那麼其第一項必然是其根,那麼只要以根為依據,將之後的數字分為連續小於根的數和連續大於等於根的數就行了,若在存在多個連續區間,那麼假設不成立,輸出no,否則繼續將連續區間繼續細化。
拿正常先序遍歷為例,從頭到尾,找到第乙個大於等於根的數,那麼其前面的數就是連續小於根的數,從這個數開始,之後的數應該都要滿足大於等於根這乙個條件,若出現了小於根的數,則輸出no,否則將兩個連續區間分別給為左子樹和右子樹進行建樹。
然後是輸出後序遍歷,我是先將根入棧,然後將其右子樹迴圈入棧,再將左子樹迴圈入棧。這樣將後序遍歷的結果翻轉,再棧頂彈出輸出。
**:
#include#include#include#includeusing namespace std;
int tree[10000];///放置建好的樹的陣列
int flag = 1;///是否為先序或映象先序序列
void check1(int root, vectora)///正常先序遍歷檢查並建樹
for(int i = p+2; i < a.size(); i++)///判斷界限右側是否還存在比根小的,若有則該序列不符合題目要求,否則繼續建樹
}vectoral, ar;
for(int i = 1; i <= p; i++)al.push_back(a[i]);///小於根的數入左部容器
for(int i = p+1; i < a.size(); i++)ar.push_back(a[i]);///大於等於根的數入右部容器
tree[root] = a[0];///根入陣列
check1(root*2, al);///檢查並建立左子樹
check1(root*2+1, ar);///檢查並建立右子樹
}void check2(int root, vectora)///映象先序遍歷檢查並建樹
for(int i = p+2; i < a.size(); i++)///判斷界限右側是否還存在大於等於根的,若有則該序列不符合題目要求,否則繼續建樹
}vectoral, ar;
for(int i = 1; i <= p; i++)al.push_back(a[i]);///大於等於根的數進入左部容器
for(int i = p+1; i < a.size(); i++)ar.push_back(a[i]);///小於根的數進入右部容器
tree[root] = a[0];///根入陣列
check2(root<<1, al);///檢查並建立左子樹
check2(root<<1|1,ar);///檢查並建立右子樹
}stackq;///用於翻轉後序遍歷,方便輸出
void find(int root)
void print()///如果結果為真,列印相應後序
check1(1, a);///正常先序遍歷檢測
if(flag == 1)
find(1);///翻轉
print();///列印
}else
find(1);///翻轉
print();///列印
}else cout<<"no"<}
return 0;
}
PTA L2 004 這是二叉搜尋樹嗎
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。輸入的第一行給出正整數 n 1000 隨後一行給出 n 個整數鍵值,其間...
pta l2 4(這是二叉搜尋樹嗎?)
題意 給定n以及n個整數,問該序列是否為二叉搜尋樹的前序遍歷或者二叉搜尋樹映象的前序遍歷,若是,則輸出yes,並輸出其後序遍歷,否則輸出no。思路 先判斷是否為二叉搜尋樹的前序遍歷,令is false,通過遞迴和二叉搜尋樹的性質計算其後序遍歷序列,若序列長度等於n,即成立,否則令is true,再次...
PAT L2 004 這是二叉搜尋樹嗎?
題目 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。輸入格式 輸入的第一行給出正整數n 1000 隨後一行給出n個整數...