7-28 搜索树判断 (25 分)(思路加详解) just easy!
一:題目
對于二叉搜索樹,我們規(guī)定任一結(jié)點(diǎn)的左子樹僅包含嚴(yán)格小于該結(jié)點(diǎn)的鍵值,而其右子樹包含大于或等于該結(jié)點(diǎn)的鍵值。如果我們交換每個節(jié)點(diǎn)的左子樹和右子樹,得到的樹叫做鏡像二叉搜索樹。
現(xiàn)在我們給出一個整數(shù)鍵值序列,請編寫程序判斷該序列是否為某棵二叉搜索樹或某鏡像二叉搜索樹的前序遍歷序列,如果是,則輸出對應(yīng)二叉樹的后序遍歷序列。
輸入格式:
輸入的第一行包含一個正整數(shù)N(≤1000),第二行包含N個整數(shù),為給出的整數(shù)鍵值序列,數(shù)字間以空格分隔。
輸出格式:
輸出的第一行首先給出判斷結(jié)果,如果輸入的序列是某棵二叉搜索樹或某鏡像二叉搜索樹的前序遍歷序列,則輸出YES,否側(cè)輸出NO。如果判斷結(jié)果是YES,下一行輸出對應(yīng)二叉樹的后序遍歷序列。數(shù)字間以空格分隔,但行尾不能有多余的空格。
輸入樣例1:
7
8 6 5 7 10 8 11
輸出樣例1:
YES
5 7 6 8 11 10 8
輸入樣例2:
7
8 6 8 5 10 9 11
輸出樣例2:
NO
二:思路
1:關(guān)于鍵值重復(fù)問題可以重復(fù) 安排到右子樹即可 保證中序當(dāng)中整體的遞增序列不變 2:解決二叉搜索樹 根據(jù)輸入的序列進(jìn)行建樹 輸出遍歷順序3:(如果上訴否 那么就用這個)解決鏡像二叉搜索樹利用層序遍歷(將輸出的順序 改為先輸出右結(jié)點(diǎn) 再輸出左結(jié)點(diǎn)) 得到層序順序后根據(jù) 層序順序建樹 3(2.0):寫完前面的碼后感覺 再寫一個建樹有點(diǎn)麻煩 重新捋捋 鏡像 就是將前序函數(shù)中的遞歸函數(shù)先輸出左改成右邊 同時后序也是4:如果都否的話 輸出 NO三:上碼
/*1:關(guān)于鍵值重復(fù)問題可以重復(fù) 安排到右子樹即可 保證中序當(dāng)中整體的遞增序列不變 2:解決二叉搜索樹 根據(jù)輸入的序列進(jìn)行建樹 輸出遍歷順序3:(如果上訴否 那么就用這個)解決鏡像二叉搜索樹利用層序遍歷(將輸出的順序 改為先輸出右結(jié)點(diǎn) 再輸出左結(jié)點(diǎn)) 得到層序順序后根據(jù) 層序順序建樹 3(2.0):寫完前面的碼后感覺 再寫一個建樹有點(diǎn)麻煩 重新捋捋 鏡像 就是將前序先輸出左改成右邊 同時后序也是 4:如果都否的話 輸出 NO */ #include<bits/stdc++.h> using namespace std;typedef struct TNode*Ptrtree; typedef struct TNode{int Data;Ptrtree left;Ptrtree right; }tnode; int N; vector<int>v1,v2,v3,v4; //建立二叉搜索樹 Ptrtree insert(Ptrtree root,int x){//插入完第一個后 根節(jié)點(diǎn)也就固定了 if(root == NULL){//將插入的操作視為 查找的時的操作,插入的地點(diǎn)視為 查找失敗的地點(diǎn) 在查找失敗的地點(diǎn) 插入一個結(jié)點(diǎn)root = (Ptrtree)malloc(sizeof(struct TNode));root->left = NULL;root->right = NULL;root->Data = x;return root;}if(root->Data > x){root->left = insert(root->left,x);}else if(root->Data <= x){root->right = insert(root->right,x);}else{return NULL;}return root; }Ptrtree creatTree(int A[],Ptrtree root){root = NULL;int i;for(i = 0; i < N; i++){root = insert(root,A[i]);}return root; } //二叉搜索樹的前序遍歷 void Preorder1( Ptrtree root ) {if( root != NULL){int temp = root->Data;v1.push_back(temp); Preorder1(root->left);Preorder1(root->right);} } //二叉搜索樹的后序遍歷 void Postorde1(Ptrtree root) {if(root != NULL){Postorde1(root->left);Postorde1(root->right);int temp = root->Data;v2.push_back(temp); } }//二叉鏡像樹的前序遍歷 void Preorder2( Ptrtree root ) {if( root != NULL){int temp = root->Data;v3.push_back(temp); Preorder2(root->right);Preorder2(root->left);} }//二叉鏡像樹的后序遍歷 void Postorde2(Ptrtree root) {if(root != NULL){Postorde2(root->right);Postorde2(root->left);int temp = root->Data;v4.push_back(temp); } }//比較兩個容器當(dāng)中的數(shù)據(jù)是否相等 int judgment( int a[],vector<int>&v) {int flag = 0;for(int i = 0; i < N; i++){if(a[i] != v[i]){flag = 1;break; }}if( flag == 0)return 1;elsereturn 0; }int main(){int a[1000];cin >> N;for(int i = 0; i < N; i++){cin >> a[i]; } Ptrtree root;root = creatTree(a,root);Preorder1(root);int flag1 = judgment(a,v1); //判斷二叉搜索樹的前序是否正確 //如果是二叉搜索樹的前序序列 正確 if( flag1 == 1 ){cout << "YES" << endl;Postorde1(root);for( int i = 0; i < v2.size(); i++ ){if( i != N-1) cout << v2[i] << ' ';elsecout << v2[i];}}else { //比較是否是鏡像的二叉樹Preorder2(root);int flag2 = judgment(a,v3);if( flag2 == 1 ){cout << "YES" << endl;Postorde(root);for( int i = 0; i < N; i++ ){if( i != N-1) cout << v4[i] << ' ';elsecout << v4[i];}}else{cout << "NO"; } }}
哈哈哈 哈哈哈哈哈哈哈哈 提前下班了 哈哈哈哈 再見明天見 老樣子 加油陌生的的你!
總結(jié)
以上是生活随笔為你收集整理的7-28 搜索树判断 (25 分)(思路加详解) just easy!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-27 家谱处理 (30 分)(详解+
- 下一篇: 7-33 地下迷宫探索 (30 分)(思