zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    windows系统设置虚拟机开机自启并运行虚拟系统
    Pycharm模板添加默认信息
    (翻译)从底层了解ASP.NET体系结构 [转]
    sql2000安装在win2003后只有在本机才能访问,局域网内其他机器不能访问
    Web上传文件的原理及实现[转]
    Http 请求处理流程[转]
    .net 必知
    sql2000数据库在企业管理器中显示置疑(suspect),在查询分析器不显示。在企业管理器中附加:提示错误823
    HTTP请求过程简介[转]
    面向对象
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11601455.html
Copyright © 2011-2022 走看看