18.11.13 二叉樹三則
二叉樹的深度(10分)
題目內容:
給定一棵二叉樹,求該二叉樹的深度
二叉樹深度定義:從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的節點個數為樹的深度
輸入格式:
第一行是一個整數n,表示二叉樹的結點個數。二叉樹結點編號從1到n,根結點為1,n <= 10
接下來有n行,依次對應二叉樹的n個節點。
每行有兩個整數,分別表示該節點的左兒子和右兒子的節點編號。如果第一個(第二個)數為-1則表示沒有左(右)兒子
輸出格式:
輸出一個整型數,表示樹的深度
輸入樣例:
3
2 3
-1 -1
-1 -1
輸出樣例:
2
1 #include <iostream> 2View Code#include <string.h> 3 #include <algorithm> 4 #include <stack> 5 #include <string> 6 #include <math.h> 7 #include <queue> 8 #include <stdio.h> 9 #include <string.h> 10 #include <vector> 11 #include <fstream> 12 #include <set> 13 #define inf 999999; 14 15 using namespace std; 16 int n; 17 struct treenode { 18 int left, right; 19 treenode() { 20 left = -1, right = -1; 21 } 22 }tree[11]; 23 24 int depth(int i) 25 { 26 if (i == -1)return 0; 27 int left, right; 28 left = depth(tree[i].left);29 right = depth(tree[i].right); 30 return max(left, right)+1; 31 } 32 int main() 33 { 34 scanf("%d", &n); 35 for (int i = 1; i <= n; i++) { 36 int x, y; 37 scanf("%d%d", &x, &y); 38 tree[i].left = x, tree[i].right = y; 39 } 40 printf("%d\n", depth(1)); 41 return 0; 42 }
物質分解記錄(10分)
題目內容:
對 物質分解記錄 的結構進行統計分析。
例如:
給出一份 物質分解記錄。
Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}
Material_11
{
Material_l3
Material_7
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_13
}
上述記錄的含義是,Material_1分解為 Material_2、Material_9和Material_10,Material_2又分解為Material_3、Material_4、Material_5和Material_8。以此類推,大括號外書寫特定物質名稱,括號內表示此特定物質分解出來的子物質名稱,每個子物質還可再分解。
現輸入一個物質名稱R,要求輸出所有和物質R在記錄中屬於同一層次且位置在R之後的物質名稱。
比如R=“Material_1” ,則應該輸出“Material_11”;
比如R=“Material_9” ,則應該輸出“Material_10”
如果R在代碼中出現了多次,則以其第一次出現為準,即僅輸出與第一次出現的R屬於同一層次且位置在R之後的語句內容。
比如R=“Material_2” ,則應該輸出
Material_9
Material_10
輸入格式:
輸入包含多組數據。第一行是物質分解記錄的份數,僅用一個整數表示。從第二行開始,每組數據包括 物質分解記錄 和 所需查找的物質R 兩部分,物質分解記錄樣式如描述中所示,R的內容和物質分解記錄之間有一行空行,下一份記錄與上一個R之間有兩行空行。
若輸入!則表示輸入結束。
為簡單起見,物質分解記錄中每一行的內容為“{”或者“}”或者一個物質名稱,不會有其他情況(比如空行)出現。同時每行文字前不會有任何縮進。物質名稱是英文字母、數字和下劃線組成的字符串。
輸出格式:
對每組數據輸出一行,如果R在記錄中找到,則輸出所有與R在同一層次且位置在R之後的物質名稱,名稱之間無需添加空格,緊密連接即可;否則輸出No。若R是其所在層次中最後一個物質,則輸出"",即輸出一個空字符。
輸入樣例:
3
Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}
Material_2
Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}
Material_11
{
Material_3
Material_7
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_13
}
Material_2
Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}
Material_20
!
輸出樣例:
Material_9Material_10
Material_9Material_10
No
提示:
讀入數據時,需采用如下方式進行讀取。
例:若要讀取一行輸入內容,則
cin.getline(line, lineSize, ‘\n‘);
sscanf(line, "%s", tmp);
其中line和tmp為數組指針,類型為char* ,linesize為line所指向的數組的規模,為int型。
所需讀取的內容最終是存儲在tmp數組中。之後如需對讀取的內容進行操作,就對tmp進行操作即可,讀到空行時tmp長度即為0。
采用其他方法讀取可能會出現WA以及RE,TLE。
1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stack> 5 #include <string> 6 #include <math.h> 7 #include <queue> 8 #include <stdio.h> 9 #include <string.h> 10 #include <vector> 11 #include <fstream> 12 #include <set> 13 #define inf 999999; 14 15 using namespace std; 16 int n; 17 struct treenode { 18 char value[30]; 19 int lay; 20 treenode *parent, *right,*child; 21 treenode() { 22 lay = 0; 23 parent = NULL, right = NULL,child=NULL; 24 } 25 treenode(char*val) { 26 int i; 27 for (i = 0; val[i]; i++) 28 value[i] = val[i]; 29 value[i] = 0; 30 lay = 0; 31 parent = NULL, right = NULL, child = NULL; 32 } 33 void setchild(treenode*x) { 34 child = x; 35 } 36 void setparent(treenode*x){ 37 parent = x; 38 } 39 void setright(treenode*x) { 40 right = x; 41 } 42 }; 43 44 bool printbro(treenode*rt, char*val) { 45 if (rt == NULL)return false; 46 if (strcmp(rt->value, val) == 0) 47 { 48 rt = rt->right; 49 while (rt) { 50 printf("%s", rt->value); 51 rt = rt->right; 52 } 53 printf("\n"); 54 return true; 55 } 56 bool now = printbro(rt->child, val); 57 if (now)return true; 58 return printbro(rt->right, val); 59 } 60 61 void init() { 62 scanf("%d",&n); 63 cin.ignore(); 64 while (n--) { 65 char line[30], tmp[30]; 66 cin.getline(line, sizeof(line), ‘\n‘); 67 sscanf(line, "%s", tmp); 68 treenode*rt=new treenode(tmp); 69 treenode*now = rt; 70 int layer = 0; 71 while (1) 72 { 73 char line[30] = { 0 }, tmp[30] = { 0 }; 74 cin.getline(line, 30, ‘\n‘); 75 sscanf(line, "%s", tmp); 76 if (strlen(tmp) == 0)break; 77 if (tmp[0] == ‘{‘) 78 layer++; 79 else if (tmp[0] == ‘}‘)layer--; 80 else { 81 treenode*thenode=new treenode(tmp); 82 if (now->lay == layer) { 83 now->setright(thenode); 84 thenode->setparent(now->parent); 85 } 86 else if (now->lay > layer) { 87 while (now->lay > layer) 88 now = now->parent; 89 now->setright(thenode); 90 thenode->setparent(now->parent); 91 } 92 else if (now->lay < layer) { 93 now->setchild(thenode); 94 thenode->setparent(now); 95 } 96 now = thenode; 97 now->lay = layer; 98 } 99 } 100 cin.getline(line, sizeof(line), ‘\n‘); 101 sscanf(line, "%s", tmp); 102 cin.getline(line, sizeof(line), ‘\n‘); 103 cin.getline(line, sizeof(line), ‘\n‘); 104 if(!printbro(rt,tmp)) 105 printf("No\n"); 106 } 107 char line[30]; 108 cin.getline(line, sizeof(line), ‘\n‘); 109 } 110 111 int main() 112 { 113 init(); 114 return 0; 115 }View Code 二叉搜索樹的層次遍歷(10分)
題目內容:
二叉搜索樹在動態查表中有特別的用處,一個無序序列可以通過構造一棵二叉搜索樹變成一個有序序列,
構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉搜索樹上新的葉子結點,在進行
插入操作時,不必移動其它結點,只需改動某個結點的指針,由空變為非空即可。
這裏,我們想探究二叉樹的建立和層次輸出。
輸入格式:
只有一行,包含若幹個數字,中間用空格隔開。(數字可能會有重復,對於重復的數字,只計入一個)
輸出格式:
輸出一行,對輸入數字建立二叉搜索樹後進行按層次周遊的結果。
輸入樣例:
51 45 59 86 45 4 15 76 60 20 61 77 62 30 2 37 13 82 19 74 2 79 79 97 33 90 11 7 29 14 50 1 96 59 91 39 34 6 72 7
輸出樣例:
51 45 59 4 50 86 2 15 76 97 1 13 20 60 77 90 11 14 19 30 61 82 96 7 29 37 62 79 91 6 33 39 74 34 72
提示:
輸入輸出的最後都不帶空格和回車換行
1 #include <iostream> 2 #include <string.h> 3 #include <algorithm> 4 #include <stack> 5 #include <string> 6 #include <math.h> 7 #include <queue> 8 #include <stdio.h> 9 #include <string.h> 10 #include <vector> 11 #include <fstream> 12 #include <set> 13 #define inf 999999; 14 15 using namespace std; 16 int n; 17 struct treenode { 18 int val; 19 treenode *left, *right; 20 treenode() { 21 val = -1, left= NULL,right = NULL; 22 } 23 treenode(int n) { 24 val = n, left = NULL, right = NULL; 25 } 26 }*rt; 27 28 void build(treenode*root, int val) { 29 if (root->val == val)return; 30 if (val > root->val) { 31 if (root->right) 32 build(root->right, val); 33 else 34 root->right = new treenode(val); 35 } 36 else if (val < root->val) { 37 if (root->left) 38 build(root->left, val); 39 else 40 root->left = new treenode(val); 41 } 42 } 43 44 void print() { 45 queue<treenode*>all; 46 printf("%d", rt->val); 47 if(rt->left) 48 all.push(rt->left); 49 if (rt->right) 50 all.push(rt->right); 51 while (!all.empty()) { 52 treenode*now = all.front(); all.pop(); 53 printf(" %d", now->val); 54 if (now->left) 55 all.push(now->left); 56 if (now->right) 57 all.push(now->right); 58 } 59 } 60 61 void init() { 62 int i=0,x; 63 cin >> x; 64 rt=new treenode(x); 65 while (cin>>x) { 66 build(rt, x); 67 } 68 print(); 69 } 70 71 int main() 72 { 73 init(); 74 return 0; 75 }View Code
數據應該都不是很強,有點懷疑到底做對沒有
好幾天都忘發了,今天補上
18.11.13 二叉樹三則