oj 二叉树相关

数据结构实验之二叉树一:树的同构
在没有new的时候,不会自动调用析构函数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Node{
 4     char u;
 5     int left;
 6     int right;
 7     Node(){
 8         u = 'A';
 9         left = 11;
10         right = 11;
11     }
12 }node1[20 + 3], node2[20 + 3];
13 
14 bool cal(int i, int j){
15     if(node1[node1[i].left].u == node2[node2[j].left].u && node1[node1[i].right].u == node2[node2[j].right].u)return true;
16     if(node1[node1[i].left].u == node2[node2[j].right].u && node1[node1[i].right].u == node2[node2[j].left].u)return true;
17     return false;
18 }
19 bool judge(int n, int m){
20     int i, j;
21     for(i = 0; i < n; i++){
22         for(j = 0; j < m; j++){
23             if(node1[i].u == node2[j].u){
24                 if(cal(i, j)){
25                     break;
26                 }
27                 else {
28                     return false;
29                 }
30             }
31         }
32         if(j == m){
33             return false;
34         }
35     }
36     return true;
37 }
38 int main(){
39     int n, m;
40     while(~scanf("%d", &n)){
41         char str[10];
42         int l, r, i;
43 
44         for(i = 0; i < n; i++){
45             scanf("%s", str);
46                 node1[i].u = str[0];
47             scanf("%s", str);
48             if(str[0] != '-'){
49                 node1[i].left = str[0] - '0';
50             }
51             else node1[i].left = 11;
52             scanf("%s", str);
53             if(str[0] != '-'){
54                 node1[i].right = str[0] - '0';
55             }
56             else 
57                 node1[i].right = 11;
58         }
59 
60         scanf("%d", &m);
61         for(i = 0; i < m; i++){
62             scanf("%s", str);
63                 node2[i].u = str[0];
64             scanf("%s", str);
65             if(str[0] != '-'){
66                 node2[i].left = str[0] - '0';
67             }
68             else node2[i].left = 11;
69             scanf("%s", str);
70             if(str[0] != '-'){
71                 node2[i].right = str[0] - '0';
72             }
73             else node2[i].right = 11;
74         }
75         if(judge(n, m))
76             printf("Yes
");
77         else
78             printf("No
");
79     }
80     return 0;
81 }

数据结构实验之二叉树二:遍历二叉树

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Node
 4 {
 5     char u;
 6     Node* left;
 7     Node* right;
 8     Node()
 9     {
10         left = NULL;
11         right = NULL;
12     }
13 };
14 char str[100];
15 int i;
16 Node *create(int len)
17 {
18     if(i >= len)
19         return NULL;
20     if(str[i] == ',')
21     {
22         i++;
23         return NULL;
24     }
25     Node* tmp = new Node();
26     tmp->u = str[i++];
27     tmp->left = create(len);
28     tmp->right = create(len);
29     return tmp;
30 }
31 void ceng(Node* root)
32 {
33     if(root)
34     {
35         ceng(root->left);
36         printf("%c", root->u);
37         ceng(root->right);
38     }
39 }
40 void hou(Node* root)
41 {
42     if(root)
43     {
44         hou(root->left);
45         hou(root->right);
46         printf("%c", root->u);
47     }
48 }
49 int main()
50 {
51 
52     while(scanf("%s", str) != EOF)
53     {
54         i = 0;
55         Node* root = new Node();
56         int len = strlen(str);
57         root = create(len);
58         ceng(root);
59         printf("
");
60         hou(root);
61         printf("
");
62     }
63     return 0;
64 }
65 
66 
67 /***************************************************
68 User name: ACM2017002信科1701黄庆祥
69 Result: Accepted
70 Take time: 0ms
71 Take Memory: 200KB
72 Submit time: 2019-09-27 21:27:21
73 ****************************************************/

 前序和中序推层序遍历,中序遍历(层序遍历通过队列实现)(非递归版)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Node{
 4     char u;
 5     Node* left;
 6     Node* right;
 7     Node(){
 8     left = NULL;
 9     right = NULL;
10     }
11 };
12 char str1[100], str2[100];
13 int cnt;
14 Node* build(Node* root, int L, int R)
15 {
16     int i;
17     char t = str1[cnt++];
18     for(i = L; i < R; i++){
19         if(str2[i] == t){
20             break;
21         }
22     }
23     root = new Node();
24     root->u = t;
25     if(i > L && i < R){
26         root->left = build(root->left, L, i);
27     }
28     if(i + 1 > L && i + 1 < R){
29         root->right = build(root->right, i + 1, R);
30     }
31     return root;
32 }
33 Node* hou(Node* root){
34     if(root){
35         hou(root->left);
36         hou(root->right);
37         printf("%c",root->u);
38     }
39 }
40 void ceng(Node* root){
41     queue<Node*>q;
42     if(root)
43     q.push(root);
44     while(!q.empty()){
45         Node* tmp = new Node();
46         tmp = q.front();
47         q.pop();
48         printf("%c",tmp->u);
49         if(tmp->left)
50         q.push(tmp->left);
51         if(tmp->right)
52         q.push(tmp->right);
53     }
54     return ;
55 }
56 int main(){
57     int T;
58     scanf("%d", &T);
59     while(T--){
60     cnt = 0;
61     Node* root = new Node();
62     scanf("%s", str1);
63     scanf("%s", str2);
64     int len = strlen(str2);
65     root = build(root, 0, len);
66     hou(root);
67     printf("
");
68     ceng(root);
69     printf("
");
70     }
71     return 0;
72 }

非递归版:

 1 Node* build(Node* root, int L, int R)
 2 {
 3    // cout << str1 << " " << str2 << endl;
 4     stack<Node*>q;
 5     root = new Node();
 6     root->u = str1[0];
 7     q.push(root);
 8     int i, j;
 9     for(i = 1, j = 0; i < R; i++){
10         Node* node = new Node();
11         node->u = str1[i];
12         Node *tmp = NULL;
13         while(!q.empty() && q.top()->u == str2[j]){
14             tmp = q.top();
15             q.pop();
16             j++;
17         }
18         if(tmp)
19             tmp->right = node;
20         else
21             q.top()->left = node;
22         q.push(node);
23     }
24     return root;
25 }

知道中序和后序求树

通过后序最后一个来判断

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Node{
 4     char u;
 5     Node* left;
 6     Node* right;
 7     Node(){
 8     left = NULL;
 9     right = NULL;
10     }
11 };
12 char str1[100], str2[100];
13 int cnt;
14 int flag = 0;
15 Node* build(Node* root, int l, int r){
16     if(flag)
17         return NULL;
18     root = new Node();
19     root->u = str2[--cnt];
20     int i, k = 0;
21     for(i = l; i < r; i++){
22         if(str1[i] == root->u){
23             k = 1;
24             break;
25         }
26     }
27     if(!k)
28         return NULL;
29     if(i + 1 < r)
30         root->right = build(root->right, i + 1, r);
31     if(i > l)
32         root->left = build(root->left, l, i);
33     return root;
34 }
35 void ceng(Node* root){
36     queue<Node*>q;
37     if(root)
38     q.push(root);
39     while(!q.empty()){
40         Node* tmp = new Node();
41         tmp = q.front();
42         q.pop();
43         printf("%c",tmp->u);
44         if(tmp->left)
45         q.push(tmp->left);
46         if(tmp->right)
47         q.push(tmp->right);
48     }
49     return ;
50 }
51 
52 int main(){
53     scanf("%s", str1);
54     scanf("%s", str2);
55     int len = strlen(str1);
56     cnt = len;
57     Node* root = new Node();
58     root = build(root, 0, len);
59     ceng(root);
60     return 0;
61 }

 非递归版

Node* build(int L, int R)
 {
    // cout << str1 << " " << str2 << endl;
    stack<Node*>q;
    Node* root = new Node();
    Node* tmp = new Node();
    root->u = str2[R - 1];
    q.push(root);
    for(int i = R - 2, j = R - 1; i >= 0; i--){
        Node* node = new Node();
        tmp = NULL;
        node->u = str2[i];
        while(!q.empty() && str1[j] == q.top()->u){
            tmp = q.top();
            q.pop();
            j--;
        }
        if(tmp == NULL)
            q.top()->right = node;
        else
            tmp->left = node;
        q.push(node);
    }
    return root;
}
原文地址:https://www.cnblogs.com/letlifestop/p/11601455.html