题目描述:

输入两颗二叉树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”(不包含引号)。

样例输入:

样例输出:
YES
NO
提示:
B为空树时不是任何树的子树。

解题思路:

  这道题有个坑,首先题目要求n与m的范围不能为0,但是测试用例中第三个和第四个有可能分别是第一个树空和第二个数空的特殊情况。因此,要特别注意这里,在scanf("%d %d",&n,&m)的时候对mn注意限制的范围。

  另外用例并没有给出单个叶子的情况,这时注意,当输入为1时,只有一个节点,并且是左子树节点。

  例如当只有一个孩子时输入的是

  

孩子节点的数目 左边孩子的编号

  另外就是这个题目的主要思想了。首先我们采用的仍然是上次题目使用的结构的树,主要思想就是遍历左边这颗树的没个元素,与右边的树进行比较。如果不同,就再比较左边的孩子节点。一直到遍历完所有的树。

  在进行比较时,判断右边的树是否为空,以及左边的判断顶点是否为空,一旦发现比较的元素不同,就证明比较失败。

  主要的代码,模仿书上代码进行,自己写的总出BUG,哎。

int testForCompare(TreeArr *t1,int t1i,TreeArr *t2){
int result = ;
if(t1i != && t2->arr[].num != ){
if(t1->arr[t1i].num == t2->arr[].num)
result = compare(t1,t1i,t2,);
if(!result)
result = testForCompare(t1,t1->arr[t1i].lchild,t2);
if(!result)
result = testForCompare(t1,t1->arr[t1i].rchild,t2);
}
return result;
};
int compare(TreeArr *t1,int t1i,TreeArr *t2,int t2i){
if(t2i == )
return ;
if(t1i == )
return ;
if(t1->arr[t1i].num != t2->arr[t2i].num)
return ;
return compare(t1,t1->arr[t1i].lchild,t2,t2->arr[t2i].lchild)&&compare(t1,t1->arr[t1i].rchild,t2,t2->arr[t2i].rchild);
}

全部代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1005
typedef struct treeelement{
int num;
int lchild;
int rchild;
}TreeElement;
typedef struct treearr{
TreeElement arr[MAXSIZE];
}TreeArr;
int testForCompare(TreeArr *t1,int t1i,TreeArr *t2);
int compare(TreeArr *t1,int t1i,TreeArr *t2,int t2i);
int main(void){
int n,m,i,nchild,n1,n2;
TreeArr *t1 = (TreeArr *)malloc(sizeof(TreeArr));
TreeArr *t2 = (TreeArr *)malloc(sizeof(TreeArr));
while(scanf("%d %d",&n,&m) != EOF){
//....initialize the tree
for(i=;i<;i++){
t1->arr[i].num = ;
t1->arr[i].lchild = ;
t1->arr[i].rchild = ; t2->arr[i].num = ;
t2->arr[i].lchild = ;
t2->arr[i].rchild = ;
}
t1->arr[].num = n;
t2->arr[].num = m;
//.....input the first tree
for(i=;i<=n;i++){
scanf("%d",&t1->arr[i].num);
}
for(i=;i<=n;i++){
scanf("%d",&nchild);
if(nchild == ){
scanf("%d %d",&n1,&n2);
t1->arr[i].lchild = n1;
t1->arr[i].rchild = n2;
}else if(nchild == ){//不确定是怎么输入的?样例中没有这项
scanf("%d",&n1);
t1->arr[i].lchild = n1;
}else if(nchild == ){ }
}
//........input the second tree
for(i=;i<=m;i++){
scanf("%d",&t2->arr[i].num);
}
for(i=;i<=m;i++){
scanf("%d",&nchild);
if(nchild == ){
scanf("%d %d",&n1,&n2);
t2->arr[i].lchild = n1;
t2->arr[i].rchild = n2;
}else if(nchild == ){//不确定是怎么输入的?样例中没有这项
scanf("%d",&n1);
t2->arr[i].lchild = n1;
}else if(nchild == ){
}
}
//testing for compare
if(testForCompare(t1,,t2))
printf("YES\n");
else
printf("NO\n");
}
return ;
};
int testForCompare(TreeArr *t1,int t1i,TreeArr *t2){
int result = ;
if(t1i != && t2->arr[].num != ){
if(t1->arr[t1i].num == t2->arr[].num)
result = compare(t1,t1i,t2,);
if(!result)
result = testForCompare(t1,t1->arr[t1i].lchild,t2);
if(!result)
result = testForCompare(t1,t1->arr[t1i].rchild,t2);
}
return result;
};
int compare(TreeArr *t1,int t1i,TreeArr *t2,int t2i){
if(t2i == )
return ;
if(t1i == )
return ;
if(t1->arr[t1i].num != t2->arr[t2i].num)
return ;
return compare(t1,t1->arr[t1i].lchild,t2,t2->arr[t2i].lchild)&&compare(t1,t1->arr[t1i].rchild,t2,t2->arr[t2i].rchild);
}
/**************************************************************
Problem: 1520
User: xhalo
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/

剑指OFFER之树的子结构(九度OJ1520)的更多相关文章

  1. 【剑指offer】树的子结构

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...

  2. 《剑指offer》 树的子结构

    本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...

  3. 剑指Offer:树的子结构【26】

    剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...

  4. 剑指 Offer 26. 树的子结构

    剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...

  5. 【剑指Offer】树的子结构 解题报告(Python)

    [剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  6. 【Java】 剑指offer(26) 树的子结构

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...

  7. Go语言实现:【剑指offer】树的子结构

    该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...

  8. 剑指Offer 17. 树的子结构 (二叉树)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目地址 https://www.nowcoder.com/practice/6e196c44c7 ...

  9. 剑指offer:树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 同样考虑用递归来做. 利用两个递归函数,一个用于判断两棵树树否相等,另一个递归取A的 ...

  10. [剑指Offer] 17.树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) [思路]要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节 ...

随机推荐

  1. centos更新163源并升级内核

    使用说明 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...

  2. 有关PHP 10条有用的建议

    1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里. 这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不 ...

  3. 无效的 URI: 未能分析证书颁发机构/主机

    出 现该错误的原因是URL中少了一个斜杠,正常的URL是“http:”后边有两个斜杠,而我在修改配置文件中的URL的IP地址部分时,不小心删掉了一个 斜杠,例如:http:/blog.csdn.net ...

  4. It is indirectly referenced from required .class files

    配置eclipse的导入包,有些包引用的位置不正确

  5. Innodb引擎 long semaphore waits

    上一篇介绍了因为子表过多,导致innodb crash的情况,但crash的原因是long semaphore waits.long semaphore waits又为何物? 背景:Innodb使用了 ...

  6. Thread: BooleanRT : Realtime 3D boolean operations for (Runtime,Editor)

    A Product by Mixed Dimensions What is BooleanRT? BooleanRT is a real-time 3D boolean operations exte ...

  7. tomcat+nginx+redis实现均衡负载、session共享(一)

    在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...

  8. RPi 2B 自动发送获取的IP到固定邮箱

    /************************************************************************* * RPi 2B 自动发送获取的IP到固定邮箱 * ...

  9. Ruby基础类型,动态特性,代码块

    #Ruby内置基础数据类型 NilClass,TureClass,FalseClass,Time,Date,String,Range,Struct,Array,Hash #Numerice 1.分为I ...

  10. Kernel 中的 GPIO 定义和控制

    最近要深一步用到GPIO口控制,写个博客记录下Kernel层的GPIO学习过程! 一.概念 General Purpose Input Output (通用输入/输出)简称为GPIO,或 总线扩展器. ...