博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题18 树的子结构
阅读量:2400 次
发布时间:2019-05-10

本文共 4297 字,大约阅读时间需要 14 分钟。

原文链接:http://ac.jobdu.com/problem.php?pid=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”(不包含引号)。

样例输入:
7 38 8 7 9 2 4 72 2 32 4 5002 6 7008 9 22 2 3001 12030
样例输出:
YESNO
提示:

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

解题思路:

1、在tree中找到(先序遍历)与子树(root2)有相同根节点的节点root1

2、同时对root1和root2做先序遍历,比较两棵树的左右子树是否相同

注意:本题测试用例有点坑

上网查找:

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

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

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

1  左孩子节点索引

本题根据上面提示修改后第三个测试用例还是未能通过。。。

代码如下:

#include 
#include
#include
using namespace std;struct treeNode { int data; treeNode *left; treeNode *right;}; bool findSubTree(treeNode *root1, treeNode *root2){ if(root2 == NULL) return true; if(root1 == NULL) return false; if(root1->data == root2->data) return findSubTree(root1->left, root2->left) && findSubTree(root1->right, root2->right); return false;} bool hasSubTree(treeNode *root1, treeNode *root2) { bool result = false; if(root1 != NULL && root2 != NULL) { if(root1->data == root2->data) result = findSubTree(root1, root2); if(!result) result = hasSubTree(root1->left, root2); if(!result) result = hasSubTree(root1->right, root2); } return result;}//tree[i][0]节点值//tree[i][1]节点左孩子序号//tree[i][2]节点右孩子序号treeNode *create(int tree[1000][3]){ treeNode *root = (treeNode *)malloc(sizeof(treeNode)); root->data = 0; root->left = NULL; root->right = NULL; queue
q; while(!q.empty()) q.pop(); q.push(root); int i = 0; while(!q.empty()) { treeNode *root = q.front(); q.pop(); root->data = tree[i][0]; if(tree[i][1] != 0){ root->left = (treeNode *)malloc(sizeof(treeNode)); q.push(root->left); } else root->left = NULL; if(tree[i][2] != 0){ root->right = (treeNode *)malloc(sizeof(treeNode)); q.push(root->right); } else root->right = NULL; if(tree[i][1] == 0 && tree[i][2] == 0) { root->left = NULL; root->right = NULL; } i ++; } return root;}int main() { int n, m; int tree[1000][3]; int subTree[1000][3]; while(scanf("%d %d", &n, &m) != EOF) { if(m == 0 || n == 0){ printf("NO\n"); continue; } for(int i = 0; i < n; i ++) scanf("%d", &tree[i][0]); for(int i = 0; i < n; i ++) { int x; int l; int r; scanf("%d", &x); if(x == 0) { tree[i][1] = 0; tree[i][2] = 0; continue; } else if(x == 1){ scanf("%d", &l); tree[i][1] = l; tree[i][2] = 0; } else{ scanf("%d %d", &l, &r); tree[i][1] = l; tree[i][2] = r; } } for(int i = 0; i < m; i ++) scanf("%d", &subTree[i][0]); for(int i = 0; i < m; i ++) { int x; int l; int r; scanf("%d", &x); if(x == 0) { subTree[i][1] = 0; subTree[i][2] = 0; continue; } else if(x == 1){ scanf("%d", &l); subTree[i][1] = l; subTree[i][2] = 0; } else{ scanf("%d %d", &l, &r); subTree[i][1] = l; subTree[i][2] = r; } } treeNode *root = create(tree); treeNode *subRoot = create(subTree); bool result = hasSubTree(root, subRoot); if(result) printf("YES\n"); else printf("NO\n"); } return 0;}/************************************************************** Problem: 1520 Language: C++ Result: Wrong Answer****************************************************************/

转载地址:http://yesob.baihongyu.com/

你可能感兴趣的文章
[转载]移动开发谁领风骚 J2ME开发工具面面观
查看>>
[转载]Java嵌入式开发之四-J2ME与MIDP开发
查看>>
java实现屏幕取色
查看>>
[转载]项目经验二则:读取war包中的文件及Ant使用中的OutOfMemoryError解决
查看>>
[转载]实例讲解配置之——TOMCAT集群配置
查看>>
[转载]保护XML文档的工具
查看>>
[转载]彻底转变流,第 2 部分:优化 Java 内部 I/O
查看>>
[转载]SWT 和 JFace, 第 2 部分: 简介
查看>>
[转载]ZX手机平台的几个问题
查看>>
[转载]JDBC编程基础
查看>>
[转载]Java手机游戏编程之MIDP图形设计篇
查看>>
[转载]Java Servlets编程指南(十八)
查看>>
DNS配置全文(转)
查看>>
程序界的高手传奇(转)
查看>>
CVS-RCS(2)(转)
查看>>
CVS-RCS(3)(转)
查看>>
CVS-RCS(5)(转)
查看>>
安装Linux的五种方法和心得(转)
查看>>
好用的工具checkinstall(转)
查看>>
了解Debian 系统(转)
查看>>