• 剑指OFFER之树的子结构


    题目描述:

    输入两颗二叉树A,B,判断B是不是A的子结构。

    输入:

    输入可能包含多个测试样例,输入以EOF结束。
    对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数)。接下来一行有n个数,每个数代表A树中第i个元素的数值,接下来有n行,第一个数Ki代表第i个节点的子孩子个数,接下来有Ki个树,代表节点i子孩子节点标号。接下来m+1行,与树A描述相同。

    输出:

    对应每个测试案例,
    若B是A的子树输出”YES”(不包含引号)。否则,输出“NO”(不包含引号)。

    样例输入:
    7 3
    8 8 7 9 2 4 7
    2 2 3
    2 4 5
    0
    0
    2 6 7
    0
    0
    8 9 2
    2 2 3
    0
    0
    
    1 1
    2
    0
    3
    0
    样例输出:
    YES
    NO
    
    提示:

    B为空树时不是任何树的子树。

    Code:
    #include <cstdio>
     
    using namespace std;
     
    struct BinaryTreeNode{
        int data;
        int lchild;
        int rchild;
    };
     
    bool DoesTree1HaveTree2(BinaryTreeNode *arr1,int root1,BinaryTreeNode *arr2,int root2){
        if(root2==0)
            return true;
        if(root1==0)
            return false;
        if(arr1[root1].data!=arr2[root2].data)
            return false;
        return DoesTree1HaveTree2(arr1,arr1[root1].lchild,arr2,arr2[root2].lchild)&&
                  DoesTree1HaveTree2(arr1,arr1[root1].rchild,arr2,arr2[root2].rchild); } bool HasSubtree(BinaryTreeNode *arr1,int root1,BinaryTreeNode *arr2,int root2){ bool result=false; if(root1!=0&&root2!=0){ if(arr1[root1].data==arr2[root2].data){ result=DoesTree1HaveTree2(arr1,root1,arr2,root2); } if(!result){ result=HasSubtree(arr1,arr1[root1].lchild,arr2,root2); } if(!result){ result=HasSubtree(arr1,arr1[root1].rchild,arr2,root2); } } return result; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){ BinaryTreeNode arr1[1010],arr2[1010]; for(int index1=1;index1<=n;++index1){ scanf("%d",&arr1[index1].data); } for(int cnt1=1;cnt1<=n;++cnt1){ int numberOfChild; scanf("%d",&numberOfChild); if(numberOfChild==2){ scanf("%d%d",&arr1[cnt1].lchild,&arr1[cnt1].rchild); }else{ if(numberOfChild==1){ scanf("%d",&arr1[cnt1].lchild); arr1[cnt1].rchild=0; }else{ arr1[cnt1].lchild=arr1[cnt1].rchild=0; } } } for(int index2=1;index2<=m;++index2){ scanf("%d",&arr2[index2].data); } for(int cnt2=1;cnt2<=m;++cnt2){ int numberOfChild; scanf("%d",&numberOfChild); if(numberOfChild==2){ scanf("%d%d",&arr2[cnt2].lchild,&arr2[cnt2].rchild); }else{ if(numberOfChild==1){ scanf("%d",&arr2[cnt2].lchild); arr2[cnt2].rchild=0; }else{ arr2[cnt2].lchild=arr2[cnt2].rchild=0; } } } if(n==0||m==0||n<m){ printf("NO "); continue; } bool ans=HasSubtree(arr1,1,arr2,1); if(ans==true) printf("YES "); else printf("NO "); } return 0; } /************************************************************** Problem: 1520 User: lcyvino Language: C++ Result: Accepted Time:10 ms Memory:1020 kb ****************************************************************/
  • 相关阅读:
    jQuery 回到顶部
    c# 获取客户端ip
    JS 新浪API获取IP归属地
    c#抓取网站数据
    ECLIPSE最常用快捷键排名
    BinarySearchTree示例——C++模板实现
    SICP 找零钱问题背后的思考
    关于解引用*和箭头操作符->的重载
    traits技法小计
    最大和子序列问题
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4153830.html
Copyright © 2020-2023  润新知