题目1520:树的子结构

2024-03-14 18:08
文章标签 题目 子结构 1520

本文主要是介绍题目1520:树的子结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

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

代码1:(用例3测试不通过:Runtime error)

#include<stdio.h>
#include<stdlib.h>typedef struct tree
{int data;struct tree *left;struct tree *right;
}Node;
Node *Atree[1099],*Btree[1099];void create(Node *node[],int a[], int n)
{int count,left,right;for(int i = 1; i <= n; i++){node[i]->data = a[i];scanf("%d",&count);if(count == 2){scanf("%d %d",&left,&right);node[i]->left = node[left];node[i]->right = node[right];}else if(count == 1){scanf("%d",&left);node[i]->left = node[left];node[i]->right = NULL; }else{node[i]->left = NULL;node[i]->right = NULL;}}
}int dif = 0;
int compare(Node *T1, Node *T2)
{if(dif == 1)    return 1;if(T2->left != NULL){if(T1->left == NULL || (T1->left->data != T2->left->data)){dif = 1;return 1;}elsecompare(T1->left,T2->left);}if(T2->right != NULL){if(T1->right == NULL || (T1->right->data != T2->right->data)){dif = 1;return 1;}elsecompare(T1->right,T2->right);}return dif;
}int main()
{int n,m;while(scanf("%d %d",&n,&m) != EOF){//创建树A int a[n + 1]; for(int i = 1; i <= n; i++)Atree[i] = new Node;for(int i = 1; i <= n; i++)scanf("%d",&a[i]);create(Atree,a,n);//创建树Bint b[m + 1];for(int i = 1; i <= m; i++)Btree[i] = new Node;for(int i = 1; i <= m; i++)scanf("%d",&b[i]);create(Btree,b,m);int j;for(j = 1; j <= n; j++){if(Atree[j]->data != Btree[1]->data)continue;dif = 0;if(compare(Atree[j],Btree[1]) == 0){printf("YES\n");break;}}if(j > n)printf("NO\n");//清空for(int i = 1;i <= n;i++){delete Atree[i];Atree[i]=NULL;}for(int i=1;i<=m;i++){delete Btree[i];Btree[i]=NULL;}}
}


 

代码2:

#include<stdio.h>
#include<stdlib.h>typedef struct tree
{int data;struct tree *left;struct tree *right;
}Node;
Node *Atree[1099],*Btree[1099];void create(Node *node[],int a[], int n)
{int count,left,right;for(int i = 1; i <= n; i++){node[i]->data = a[i];scanf("%d",&count);if(count == 2){scanf("%d %d",&left,&right);node[i]->left = node[left];node[i]->right = node[right];}else if(count == 1){scanf("%d",&left);node[i]->left = node[left];node[i]->right = NULL; }else{node[i]->left = NULL;node[i]->right = NULL;}}
}//第二步 左右子树都判断
bool IsContain(Node* root1,Node* root2)
{if(root2==NULL)     //必须先判断root2是否是nullreturn true;if(root1==NULL)return false;if(root1->data!=root2->data)return false;return IsContain(root1->left,root2->left)&& IsContain(root1->right,root2->right);
}//第一步 找到根节点相同的值
bool HasSubTree(Node* root1,Node* root2)
{bool result=false;if(root1!=NULL&&root2!=NULL){if(root1->data==root2->data){result=IsContain(root1,root2);}if(!result){result=HasSubTree(root1->left,root2);}if(!result){result=HasSubTree(root1->right,root2);}}return result;
}int main()
{int n,m;while(scanf("%d %d",&n,&m) != EOF){//创建树A int a[n + 1];for(int i = 1; i <= n; i++)Atree[i] = new Node;for(int i = 1; i <= n; i++)scanf("%d",&a[i]);create(Atree,a,n);//创建树Bint b[m + 1];for(int i = 1; i <= m; i++)Btree[i] = new Node;for(int i = 1; i <= m; i++)scanf("%d",&b[i]);create(Btree,b,m);//判断bool result=HasSubTree(Atree[1],Btree[1]);printf("%s\n",result?"YES":"NO");//清空for(int i = 1;i <= n;i++){delete Atree[i];Atree[i]=NULL;}for(int i=1;i<=m;i++){delete Btree[i];Btree[i]=NULL;}}
}


 

这篇关于题目1520:树的子结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809252

相关文章

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

msyql执行效率的问题以及常见基础面试题目

SQL被称为结构化查询语言(Structured Query Language )是操作和检索关系型数据库的标准语言 SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。 ※ 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。    Data Definition Language ※ 数据

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整论文+代码+结果

编辑 2024国赛A题参考论文https://download.csdn.net/download/qq_52590045/897183672024国赛D题参考论文https://download.csdn.net/download/qq_52590045/897158482024国赛E题参考论文https://download.c

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整论文+代码结果

2024国赛C题参考论文https://download.csdn.net/download/qq_52590045/89718370网盘链接形式,在里更新 2024国赛A题参考论文https://download.csdn.net/download/qq_52590045/89718367      网盘链接形式,在里更新

代码随想录Day 36|滑铁卢了,leetcode题目:1049.最后一块石头的重量、494.目标和、474.一和零

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划一、题目题目一:1049.最后一块石头的重量II解题思路: 题目二:494.目标和动态规划 (二维dp数组)#动态规划 (一维dp数组) 题目三: 474.一和零解题思路: 总结 动态规划 有点难了,之前差的有点多,找时间补 一、题目 题目一:1049.最后一块石头的重量II leetcode题目链接