子树

来源:互联网 发布:淘宝怎么货到付款手机 编辑:程序博客网 时间:2024/04/29 04:34

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

 注意事项

若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。

样例

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

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

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

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

4

解题思路:因为数据很水,直接运用以前两树进行匹配的代码,边搜索边匹配,并用flag进行标记,如果成功就跳出,注意一下特殊情况,级T1和T2是空树的情况即可。

class Solution {public:    /**     * @param T1, T2: The roots of binary tree.     * @return: True if T2 is a subtree of T1, or false.     */     bool ans=1,Ans=0;     bool same(TreeNode *a,TreeNode *b){    if(ans==0)return 0;    if(a!=NULL&&b!=NULL){            if(a->val!=b->val){                    ans=0;                    return 0;            }            else {                    same(a->left,b->left);                    same(a->right,b->right);                    return ans;            }    }    if(a!=NULL&&b==NULL){ans=0;return 0;}    if(b!=NULL&&a==NULL){ans=0;return 0;}    return ans;    }    bool dfs(TreeNode *T1,TreeNode *T2){        if(T1==NULL)return Ans;    ans=1;    if(same(T1,T2))Ans=1;    if(Ans==1)return Ans;    dfs(T1->left,T2);    dfs(T1->right,T2);}    bool isSubtree(TreeNode *T1, TreeNode *T2) {        // write your code here        if(T2==NULL)return 1;if(T1==NULL)return 0; return dfs(T1,T2);            }};

0 0
原创粉丝点击