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语言了,刚开学编的话还是有点不熟练,编程的时候也有阻碍,但是好在题目简单,所以很轻易解决了。

原创粉丝点击