1. 程式人生 > >18.11.13 二叉樹三則

18.11.13 二叉樹三則

col 包括 eof 輸入格式 查找 amp 二叉樹深度 iostream 整數

二叉樹的深度(10分)

題目內容:

給定一棵二叉樹,求該二叉樹的深度

二叉樹深度定義:從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的節點個數為樹的深度

輸入格式:

第一行是一個整數n,表示二叉樹的結點個數。二叉樹結點編號從1到n,根結點為1,n <= 10

接下來有n行,依次對應二叉樹的n個節點。

每行有兩個整數,分別表示該節點的左兒子和右兒子的節點編號。如果第一個(第二個)數為-1則表示沒有左(右)兒子

輸出格式:

輸出一個整型數,表示樹的深度

輸入樣例:

3
2 3
-1 -1
-1 -1

輸出樣例:

2
技術分享圖片
 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 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 }
View Code

物質分解記錄(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 二叉樹三則