Subtree

来源:互联网 发布:数据分析师需要学什么 编辑:程序博客网 时间:2024/05/20 09:48

You have two every large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of T1.

Have you met this question in a real interview? 
Yes
Example

T2 is a subtree of T1 in the following case:

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

T2 isn't a subtree of T1 in the following case:

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

A tree T2 is a subtree of T1 if there exists a node n in T1 such that the subtree of n is identical to T2. That is, if you cut off the tree at node n, the two trees would be identical.

题目实际上是sameTree的变形,树T2如果是另外树T1的子树,那么在T1中一定可以找到一颗子树与T2一样,那就是说,我们可以递归的检查,如果T1->val == T2->val,则应该检查isSameTree(T1, T2);如果不相等,则还应该继续递归检查isSubTree(T1->left, T2) || is SubTree(T1->right, T2)。应该属于常规的树的问题,注意各个细节的考虑。

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

0 0