剑指offer面试题18——树的子结构(递归)
2015-08-06 14:53
316 查看
题目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”(不包含引号)。
样例输入:
样例输出:
提示:
B为空树时不是任何树的子树
思路:
这道题采用递归的做法来做。即对于A树和B树,欲判断B树是否是A树的子树,先在A书上中序遍历,判断第一个结点
是否相等,若是不等就没必要再深入判断下面的结点了
若是判断一个结点相等,接下来判断每一个下面的结点是否相等,也采用中序遍历。
题目描述:
输入两颗二叉树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为空树时不是任何树的子树
思路:
这道题采用递归的做法来做。即对于A树和B树,欲判断B树是否是A树的子树,先在A书上中序遍历,判断第一个结点
是否相等,若是不等就没必要再深入判断下面的结点了
若是判断一个结点相等,接下来判断每一个下面的结点是否相等,也采用中序遍历。
#include<iostream> using namespace std; // struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; //判断从L1这个结点开始是否包含L2 bool dosethesum(TreeNode* L1,TreeNode* L2) { bool flag=true; if(L2==NULL)//若L2已经到末尾了,即节点都相等 return true; if(L1==NULL)//若L1已经到末尾了,即说明还没完,但L1已经没了,所以不包含 return false; if(L1->val!=L2->val)//先判断当前结点相不相等 flag=false; if(flag==true) flag=dosethesum(L1->left,L2->left);//再判断左子树的结点相不相等 if(flag==true) flag=dosethesum(L1->right,L2->right);//再判断右子树的结点相不相等 return flag; } //主函数L1中是否包含L2(不一定是L1的头结点开始相等) bool ifsubtree(TreeNode* root1,TreeNode* root2) { bool flag=false; if(root1==NULL||root2==NULL)//若是L1或者L2中有一个为空直接不可能包含 flag=false; if(root1->val==root2->val)//若这两个结点相等,就可以开始调用函数判断了 flag=dosethesum(root1,root2); if(flag==false)//若不等,则在L1上左子树开始查找 flag=ifsubtree(root1->left,root2); if(flag==false)//若不等则在L1的右子树上开始查找 flag=ifsubtree(root1->right,root2); return flag; } int main() { system("pause"); }
相关文章推荐
- 企业招聘面试十大之怪现状
- 经典面试题 之 大小端 & 内存对齐补齐
- 黑马程序员 ---- java基础之基本语法
- 微软面试、经典算法、编程艺术、红黑树4大系列总结
- 理想的程序员
- Java高级软件工程师面试题
- 黑马程序员——异常
- 数据库常见的面试题
- Android开发面试经——1.常见人事面试问题
- 黑马-面试经历2
- 黑马-面试经历1
- android面试常问问题总结
- 黑马程序员——18,泛型应用,Map
- 黑马程序员-------面向对象基础知识2
- 如何在面试中发现优秀程序员
- 面试总结10
- 一张图道尽程序员的出路
- leetcode面试准备: CountPrimes
- 面试的心得
- 程序员20%的空闲时间要做什么!(转)