lintcode-递归-简单-245子树
来源:互联网 发布:行省制的影响知乎 编辑:程序博客网 时间:2024/05/22 17:51
点此直接进入题目
预备知识:二叉树,递归。
解题思路:根据所学知识我们可以知道子树的定义,然后根据题目提示我们可以知道只要将T1子树在某处切断然后剩下的和T2相等即可。
解题过程:知道了思路以后,我们就能很轻易地解决题目,首先递归应该先解决递归出口,开始时,当T2是空树时,那么T2是T1的子树;当T1树递归到空,此时T2也递归到空时,那么T2是T1的子树,若T2没有递归到空时,那么T2不是T1的子树。若T1没递归到空时,但T2已经递归到空,那么T2不是T1的子树,若两个子树都没递归到空时,那么继续递归。
以下为代码实现:
bool isSubtree(TreeNode * T1, TreeNode * T2)
{
if(T2==NULL) return 1;\\当T2开始时为空时,直接返回1;
else if(T1==NULL) return 0;\\T1空,T2不空时,直接返回0;
else{\\T1,T2都不空时;
if(T1->val==T2->val)\\若T1,T2两个子树的根节点的值相同,然后接着判断左右子树子树是否相同;
{
int a,b;\\a,b的值分别代表T1,T2的左右子树是否相等(1/0);
if(T2->left==NULL)
{
if(T1->left!=NULL) a=0;
else a=1;\\若T2的左子树是空树时,当T1的左子树不是空树时,两者不同,a=0;否则两者左子树都空时,a=1;
}
else a=isSubtree(T1->left,T2->left);\\T2左子树不空时,进入递归,不考虑T1左子树是否空;
if(T2->right==NULL)
{
if(T1->right!=NULL) b=0;
else b=1;
}
else b=isSubtree(T1->right,T2->right);\\与左子树相同;
return a*b+isSubtree(T1->left,T2)+isSubtree(T1->right,T2);\\a*b的意思是,T1,T2的左右子树如果有一个不同那么该节点开始T2不是T1的子树;后面加上的两个递归意思是,T1的左子树与T2的判断,以及T2的右子树与T2的判断;希望大家能明白为什么要用乘号和加号;
}
else{
return isSubtree(T1->left,T2)+isSubtree(T1->right,T2);\\T1,T2根节点不同时,进入递归,T1左子树与右子树分别与T2子树进行判断;
}
}
}
注意事项:这个题目只要思路清晰就可以了,然后会一点二叉树的相关基础知识就可以,然后知道递归的出口,递归的条件就可以了。在编程之前一定要在脑子里面把思路理清楚,或者在纸上画出来条件图。
个人感想:一个暑假没看c语言了,刚开学编的话还是有点不熟练,编程的时候也有阻碍,但是好在题目简单,所以很轻易解决了。
- lintcode-递归-简单-245子树
- LintCode-剑指Offer-(245)子树
- LintCode 子树
- lintcode-子树
- lintcode ----子树
- lintcode,子树
- LintCode 子树
- 子树-LintCode
- LintCode-子树
- Lintcode 子树
- lintcode子树
- LintCode 子树
- LintCode 子树
- 子树-LintCode
- 拓扑结构相同子树 类似[LintCode]245
- 子树(LintCode)
- lintcode subtree 子树
- lintcode——子树
- 存储系统的那些事
- RQNOJ 140 分配时间
- bzoj 4001: [TJOI2015]概率论(找规律)
- yolo V2
- C#209课的主要内容
- lintcode-递归-简单-245子树
- java重定向输出流实现程序日志
- 安装破解版Dreamweaver CS6
- 根事务要确认,但事务中止了操作—解决办法
- hdu6098
- C++ Lambda表达式
- python语句结构
- 测试用例---常用设计方法,等价类,边界值,因果图判定表,正交表,场景法,大纲法
- oracle DDLsql语句字段效率&索引