子树

来源:互联网 发布:reference type java 编辑:程序博客网 时间:2024/04/29 07:18

1.问题描述:有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定T2 是否为 T1的子树。

2.思路:样例

下面的例子中 T2 是 T1 的子树:

       1                3      / \              / T1 = 2   3      T2 =  4        /       4

下面的例子中 T2 不是 T1 的子树:

       1               3      / \               \T1 = 2   3       T2 =    4        /       4

先判断T1、T2是否为空,①如果T2是空则它直接是T1的子树,②然而如果T1是空则是不对的。③而如果T1的值等于T2的值,并且它们剩下的节点的值及位置经过遍历也是相同的,则T2就是T1的子树。④还有一种情况就是T1左子树的某个节点值与T2的根节点相同且通过遍历发现后面的值及位置相同则T2是T1的子树⑤T1右子树的某个节点值与T2的根节点相同且通过遍历发现后面的值及位置相同则T2是T1的子树

3.代码:

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /**     * @param T1, T2: The roots of binary tree.     * @return: True if T2 is a subtree of T1, or false.     */    bool isSubtree(TreeNode *T1, TreeNode *T2)    {      // write your code here      if(!T2)      return true;      if(!T1)      return false;      if(T1->val==T2->val)      { if(check(T1,T2))      return true;      }      if(isSubtree(T1->left,T2))         return true;      if(isSubtree(T1->right,T2))         return true;     return false;    }    bool check(TreeNode *T1,TreeNode *T2){          if(!T1&&!T2)          return true;        if(!T1||!T2)          return false;        if(T1->val==T2->val){            return check(T1->left,T2->left)&&check(T1->right,T2->right);        }        return false;    }};

4.感想:这个题目一开始无从下手从网上搜了搜代码才明白,情况也比较多容易漏~

0 0
原创粉丝点击