子树

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

 注意事项

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

-----------------------******************-----------------------------

判断两棵树是否相等的代码

 1 bool same(TreeNode *T1, TreeNode *T2)
 2 {
 3     if(T1==NULL&&T2==NULL)
 4     return true;
 5     if(T1!=NULL&&T2!=NULL){
 6         if(T1->val==T2->val)
 7         {
 8             if(same(T1->left,T2->left)&&same(T1->right,T2->right))
 9                 return true;
10         }
11     }
12     return false;
13 }

判断是否为子树的代码

 1     bool isSubtree(TreeNode *T1, TreeNode *T2) {
 2         // write your code here
 3       // write your code here
 4         if(!T2)  
 5             return true;  
 6         if(!T1)  
 7             return false;
 8         if(T1!=NULL&&T2!=NULL)
 9         {
10             if(same(T1,T2))
11             return true;
12             else
13                {
14                    if(isSubtree(T1->right,T2)||isSubtree(T1->left, T2))
15                    return true;
16             }
17         }
18         return false;
19     }

全部代码:

/**
 * 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 same(TreeNode *T1, TreeNode *T2)
    {
        if(T1==NULL&&T2==NULL)
        return true;
        if(T1!=NULL&&T2!=NULL){
            if(T1->val==T2->val)
            {
                if(same(T1->left,T2->left)&&same(T1->right,T2->right))
                    return true;
            }
        }
        return false;
    }
    bool isSubtree(TreeNode *T1, TreeNode *T2) {
        // write your code here
      // write your code here
        if(!T2)  
            return true;  
        if(!T1)  
            return false;
        if(T1!=NULL&&T2!=NULL)
        {
            if(same(T1,T2))
            return true;
            else
               {
                   if(isSubtree(T1->right,T2)||isSubtree(T1->left, T2))
                   return true;
            }
        }
        return false;
    }
};

虽然在lintcode上面是简单题,但是对于一个小白来说还是花费很多的时间,但是在做的过程中更加理解了递归,还是蛮值得的。

努力!   奋斗!

 

posted @ 2017-05-11 22:29  小花同学  阅读(340)  评论(0编辑  收藏  举报