HDU 3791 二叉搜索樹
阿新 • • 發佈:2018-10-30
輸入 pat 風格 c++ data align hdu nbsp include
HDU 3791 二叉搜索樹
判斷兩序列是否為同一二叉搜索樹序列Input開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。
接下去一行是一個序列,序列長度小於10,包含(0~9)的數字,沒有重復數字,根據這個序列可以構造出一顆二叉搜索樹。
接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜索樹。Output如果序列相同則輸出YES,否則輸出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
解題思路:
本題要求以第一個字符串建立二叉搜索樹,之後每行一個給出n個字符串,如果以該行字符串
所建立的二叉搜索樹與第一個字符串所建立的樹相同輸出YES,否則輸出NO。
可以考慮設計一個inPut函數,記錄輸入的每個字符串,並使用輸入輸出控制類
istringstream創建一個對象綁定我們記錄的字符串並模擬C++風格串流的輸入操作將每一個字符
加入到一個容器中以便建樹時使用(當然直接遍歷記錄的字符串也可以)。改進一下先序遍歷函數
將樹的先序遍歷記錄到一個字符串中,之後每個先序遍歷字符串與第一個輸入的樹的先序遍歷字符
串比較就可以了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef char typeData; 4 struct node{ 5 typeData data; 6 node *leftChild; 7 node *rightChild; 8 node(){ //構造函數 9 leftChild = NULL; 10 rightChild = NULL; 11 } 12 }; 13 vector<typeData> data; //data記錄輸入字符串的每一個元素14 string text, pattern; 15 //text用來記錄第一個字符串所建的二叉搜索樹的前序遍歷 16 //pattern記錄之後每一行輸入所建立的二叉搜索樹的前序遍歷 17 void inPut(){ 18 string temp1, temp2; //temp記錄輸入的字符串 19 typeData num; 20 temp2 = ""; 21 data.clear(); //每次建樹都要清空容器,清空temp2字符串 22 cin >> temp1; 23 24 for(string::iterator it = temp1.begin(); it != temp1.end(); it++){25 if(it != temp1.begin()){ 26 temp2 += ‘ ‘; 27 } //將temp1中的每一個元素用空格分隔並記錄在temp2中 28 temp2 += *it; 29 } 30 istringstream cin_line(temp2); //istringstream綁定temp2 31 while(cin_line >> num){ 32 data.push_back(num);//記錄的值加入容器 33 } 34 } 35 void insertBST(node *&root, typeData x){ //二叉搜索樹插入函數 36 //註意函數要進行插入操作,根結點要傳引用 37 if(root == NULL){ //找到空位置即使插入位置 38 root = new node(); //新建結點權值為x 39 root->data = x; 40 return; 41 } 42 if(x == root->data){ //要插入結點已存在直接返回 43 return; 44 }else if(root->data > x){ //x比根結點數據域小 需要插在左子樹 45 insertBST(root->leftChild, x); //往左子樹搜索 46 }else if(root->data < x){ //x比根結點數據域大 需要插在右子樹 47 insertBST(root->rightChild, x); //往右子樹搜索 48 } 49 } 50 node *createBST(){ //建樹 51 node *root = NULL; //新建結點root 52 for(vector<typeData>::iterator it = data.begin(); it != data.end(); it++){ 53 insertBST(root, *it); //將容器中我們處理好的值插入二叉搜索樹 54 } 55 return root; //返回根結點 56 } 57 void preorder(node *root, string &str){ 58 //改進先序遍歷函數,將先序遍歷記錄在str中,由於要修改str所以傳引用 59 if(root == NULL) //到達空樹為遞歸邊界 60 return; 61 str += root->data; //訪問根結點記錄數據到str 62 preorder(root->leftChild, str); //訪問左子樹 63 preorder(root->rightChild, str); //訪問右子樹 64 } 65 int main() 66 { 67 int n; 68 while(cin >> n){ //本題有多組測試數據 69 if(n == 0) //如果輸入的n為0跳出循環 70 break; 71 inPut(); //輸入字符串 72 node *root = createBST(); //建樹 73 text = ""; //清空text 74 preorder(root, text); //text記錄首位二叉搜索樹 75 while(n--){ //輸入n個字符串建樹比較 76 inPut(); 77 node *root = createBST(); 78 pattern = ""; 79 preorder(root, pattern); 80 if(text == pattern) 81 cout << "YES" << endl; 82 else 83 cout << "NO" << endl; 84 85 } 86 } 87 return 0; 88 }
HDU 3791 二叉搜索樹