zoukankan      html  css  js  c++  java
  • 7-1 树的同构 (25 分)

    题目 :

    给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

    图一:

    图二:

    现给定两棵树,请你判断它们是否是同构的。

    输入格式:

    输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (10),即该树的结点数(此时假设结点从0到N1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

    输出格式:

    如果两棵树是同构的,输出“Yes”,否则输出“No”。

    思路:

    这个题读完题之后,没有建树,而是直接处理的树中每个节点的左孩子与右孩子的信息。

    根据题意可以得知只要两棵树上每个节点的左右孩子一样,那么这两棵树就是同构。

    所以,根据给出的信息,分别存一下两个树的孩子信息,然后两棵树相同的节点分别进行比较,最后得出结果。

    代码:

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define FRE() freopen("in.txt","r",stdin)
    using namespace std;
    typedef long long ll;
    struct Node {
        char lchild;
        char rchild;
        int idxl;
        int idxr;
        char root;
        bool vis = false;
    };
    Node f1[27],f2[27];
    Node tree1[27],tree2[27];
    
    bool judgeSame(Node a,Node b) {
        bool ok = false;
        if(a.lchild == b.lchild && a.rchild == b.rchild) {
            ok = true;
        }
        if(a.lchild == b.rchild && a.rchild == b.lchild) {
            ok = true;
        }
        return ok;
    }
    
    bool judge(char op){
        if(op>='0' && op<='9'){
            return true;
        }else{
            return false;
        }
    }
    
    int main() {
        int n,m;
    
        cin>>n;
        for(int i = 0; i<n; i++) {//存信息
            getchar();
            char o1,o2;
            cin>>f1[i].root>>o1>>o2;
            if(judge(o1))
                f1[i].idxl = o1-'0';
            else
                f1[i].idxl = -1;
    
            if(judge(o2))
                f1[i].idxr = o2-'0';
            else
                f1[i].idxr = -1;
        }
    
        cin>>m;
        for(int i = 0; i<m; i++) {//存信息
            char o1,o2;
            getchar();
            cin>>f2[i].root>>o1>>o2;
            if(judge(o1))
                f2[i].idxl = o1-'0';
            else
                f2[i].idxl = -1;
    
            if(judge(o2))
                f2[i].idxr = o2-'0';
            else
                f2[i].idxr = -1;
        }
    
        for(int i = 0; i<n; i++) {//处理保存第一棵树的孩子信息
            int idx = f1[i].root - 'A';
            int idl = f1[i].idxl;
            int idr = f1[i].idxr;
            if(idl>=0)
                tree1[idx].lchild = f1[idl].root;
            else
                tree1[idx].lchild = '#';
            if(idr>=0)
                tree1[idx].rchild = f1[idr].root;
            else
                tree1[idx].rchild = '#';
            tree1[idx].vis = true;
        }
    
    //    for(int i = 0; i<25; i++){
    //        if(tree1[i].vis)
    //            cout<<'A'+i<<" "<<tree1[i].lchild<<" "<<tree1[i].rchild<<endl;
    //    }
    
        for(int i = 0; i<m; i++) {//处理保存第二棵树的孩子信息
            int idx = f2[i].root - 'A';
            int idl = f2[i].idxl;
            int idr = f2[i].idxr;
            if(idl>=0)
                tree2[idx].lchild = f2[idl].root;
            else
                tree2[idx].lchild = '#';
            if(idr>=0)
                tree2[idx].rchild = f2[idr].root;
            else
                tree2[idx].rchild = '#';
            tree2[idx].vis = true;
        }
    //    cout<<endl<<"-----------------------------------------------"<<endl;
    //    for(int i = 0; i<25; i++){
    //        if(tree2[i].vis)
    //            cout<<" "<<tree2[i].lchild<<" "<<tree2[i].rchild<<endl;
    //    }
    
        bool ok = true;
        for(int i = 0; i<26; i++) {//两棵树的相同的节点分别进行比较
            if(!judgeSame(tree1[i],tree2[i])) {
                ok = false;
            }
        }
    
        if(ok) {
            cout<<"Yes"<<endl;
        } else {
            cout<<"No"<<endl;
        }
        return 0;
    }
    
    /*
    PutIn:
    8
    A 1 2
    B 3 4
    C 5 -
    D - -
    E 6 -
    G 7 -
    F - -
    H - -
    8
    G - 4
    B 7 6
    F - -
    A 5 1
    H - -
    C 0 -
    D - -
    E 2 -
    PutOut:
    Yes
    */
    /*
    PutIn:
    8
    B 5 7
    F - -
    A 0 3
    C 6 -
    H - -
    D - -
    G 4 -
    E 1 -
    8
    D 6 -
    B 5 -
    E - -
    H - -
    C 0 2
    G - 3
    F - -
    A 1 4
    PutOut:
    No
    */
    View Code
  • 相关阅读:
    HDU 1063 Exponentiation
    HDU 1261 字串数
    HDU 1715 大菲波数
    HDU 1002 A + B Problem II
    csharp 復制DataTable修改某列的值
    解决IE6下透明PNG图片有灰底的解决方案
    webform TextBox以一条横线显示 兼容各主流瀏覽器 .
    SQL 工齡計算
    csharp Format CultureInfo
    Csharp Winform TextBox 樣式以一條橫線顯示
  • 原文地址:https://www.cnblogs.com/sykline/p/9965755.html
Copyright © 2011-2022 走看看