對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。
現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹的後序遍歷序列。
輸入的第一行包含乙個正整數n(≤1000),第二行包含n個整數,為給出的整數鍵值序列,數字間以空格分隔。
輸出的第一行首先給出判斷結果,如果輸入的序列是某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,則輸出yes
,否側輸出no
。如果判斷結果是yes
,下一行輸出對應二叉樹的後序遍歷序列。數字間以空格分隔,但行尾不能有多餘的空格。
7
8 6 5 7 10 8 11
yes
5 7 6 8 11 10 8
7
8 6 8 5 10 9 11
no
題解:先建立起二叉搜尋樹,然後將先序遍歷和映象先序遍歷的結果分別放到陣列裡,然後判斷是否有乙個與原陣列相同,只要有1個相同就輸出yes,然後後序遍歷即可。(看完思路應該就大開了吧~~)
#includeusing namespace std;
struct node
;int a[10001],b[10001],c[10001];
int top,tot,flag1=1,flag2=1,flag3,flag4;
node *create(node *root,int x)
else
return root;
}void show1(node *root)
}void show2(node *root)
}void finallshow1(node *root)
else
cout<<" "}
}void finallshow2(node *root)
else
cout<<" "}
}int main()
show1(root);//分別將先序遍歷和映象先序遍歷放入b和c陣列裡
show2(root);
for(int i=1;i<=n;i++)//只要有1個不同,就說明不是該樹的遍歷
}for(int i=1;i<=n;i++)
}if(flag1)
else if(flag2)
else
cout<<"no"
}
7 28 搜尋樹判斷 25分
對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹...
3 搜尋樹判斷 25分
對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹...
5 4 搜尋樹判斷 25分
5 4 搜尋樹判斷 25分 對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序...