日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7-28 搜索树判断 (25 分)(思路加详解) just easy!

發(fā)布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-28 搜索树判断 (25 分)(思路加详解) just easy! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:題目

對于二叉搜索樹,我們規(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。