剑指OFFER之树的子结构(九度OJ1520)
题目描述:
-
输入两颗二叉树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)的更多相关文章
- 【剑指offer】树的子结构
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...
- 《剑指offer》 树的子结构
本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...
- 剑指Offer:树的子结构【26】
剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...
- 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...
- 【剑指Offer】树的子结构 解题报告(Python)
[剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【Java】 剑指offer(26) 树的子结构
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...
- Go语言实现:【剑指offer】树的子结构
该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...
- 剑指Offer 17. 树的子结构 (二叉树)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目地址 https://www.nowcoder.com/practice/6e196c44c7 ...
- 剑指offer:树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 同样考虑用递归来做. 利用两个递归函数,一个用于判断两棵树树否相等,另一个递归取A的 ...
- [剑指Offer] 17.树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) [思路]要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节 ...
随机推荐
- Android 自定义Button按钮显示样式(正常、按下、获取焦点)
现在的用户对APP的外观看得很重要,如果APP内所有元件都用Android默认样式写,估计下面评论里就有一堆在骂UI丑的.今天学习自定义Button按钮样式.Button样式修改的是Button的背景 ...
- My97 DatePicker使用之自定义事件
参考网站:http://www.my97.net/dp/demo/resource/2.5.asp 自定义事件 如果你需要做一些附加的操作,你也不必担心,日期控件自带的自定义事件可以满足你的需求.此外 ...
- bzoj列表2
之前发过一次了,这里的题较水,没什么好讲的 bzoj1088 直接穷举前两位即可,话说程序员的扫雷是白玩的? bzoj1083 裸的最小生成树(最小生成树=最小瓶颈树),SCOI大丈夫(话说网上二分是 ...
- (转载) ExtJs大比拼JQuery:Dom文档操作
此次不生产水,做一次搬运工. http://www.cnblogs.com/lipan/archive/2011/12/07/2269815.html
- HAOI2007 理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ...
- JPA---一对一关系
在JPA中,使用@oneToOne来标示. package com.yl.demo1.bean.oneToone; import javax.persistence.CascadeType; impo ...
- onAttachedToWindow () 和 onDetachedFromWindow () ; 以及更新视图的函数ondraw() 和dispatchdraw()的区别
protected void onAttachedToWindow() This is called when the view is attached to a window. At this po ...
- 静态Web开发 JQuery
伍章 JQuery 1节介绍JQuery和顶级对象 <<锋利的JQuery>>JQuery官网: http://jquery.com (下载jquery工具)JQuery在线A ...
- codeforces 401D (数位DP)
思路:很明显的数位dp,设dp[i][j] 表示选取数字的状态为i,模m等于j的数的个数,那么最后的答案就是dp[(1<<n)-1][0].状态转移方程就是,dp[i|(1<< ...
- 浏览器插件 - 通用注入模版JS
//TIP:先通过Tampermonkey编写为可用脚本,再套用此通用模版,再拖到Chrome安装为扩展即可. /* 通用注入原型3:*/ switch (window.location.pathna ...