子树

来源:互联网 发布:vs2013能做php开发吗 编辑:程序博客网 时间:2024/04/29 03:50
描述:

有两个不同大小的二进制树: 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

解题思路:判断一棵树T2是不是另外一颗树T1的子树,就是从T1的T2部分砍断以后,剩余部分是不是与T2一样。对此我们可以对两个子树部分的每个节点进行检查。为此我们可以定义一个check函数,用于判断两棵子树是否完全相同。另外一个问题就是,T2这棵子树有可能就是T1本身,也可能是T1左子树的一部分,亦有可能是T1右子树的一部分。为此可以定义一个dfs函数来确定T2位于T1之中的哪一部分。最后就可以写出具体函数啦。

实现代码:

/**
 * 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 flag;
    bool check(TreeNode *T1, TreeNode *T2) {
        // write your code here
        if (T1 == NULL && T2 != NULL)
            return false;
        if (T1 != NULL && T2 == NULL)
            return false;


        if (T1 == NULL && T2 == NULL)
            return true;
        if (T1->val != T2->val)
            return false;
        
        return check(T1->left, T2->left) && check(T1->right, T2->right);
    }


    void dfs(TreeNode *T1, TreeNode *T2) {
        //if (flag) return;
        if (check(T1, T2)) {
            flag = true;
            return;
        }
        if (T1 == NULL)            
            return;
    
        dfs(T1->left, T2);
        dfs(T1->right, T2);
        
    }
    bool isSubtree(TreeNode *T1, TreeNode *T2) {
        // write your code here
        flag = false;
        dfs(T1, T2);
        return flag;
    }
};


做题感想:

通过这一个题,为了实现最后一个函数的功能,前面定义了两个函数来做准备。所以以后在考虑问题的时候,应该擅于把大问题逐步分解为小问题,考虑问题要全面,要看清各个小问题之间的联系。

0 0
原创粉丝点击