【多次过】Lintcode 245. 子树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82585076

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

样例

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

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

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

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

注意事项

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


解题思路1:

将两树都序列化为字符串,然后看t2字符串是否为t1的字串即可,但这样通过率50%,时间复杂度过高。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param T1: The roots of binary tree T1.
     * @param T2: The roots of binary tree T2.
     * @return: True if T2 is a subtree of T1, or false.
     */
    public boolean isSubtree(TreeNode T1, TreeNode T2) {
        // write your code here
        String t1Str = serialByPre(T1);
        String t2Str = serialByPre(T2);
        
        int flag = t1Str.indexOf(t2Str);
        if(flag == -1)
            return false;
        else
            return true;
    }
    
    public String serialByPre(TreeNode root){
        if(root == null)
            return "#,";
            
        String res = root.val+",";
        
        res += serialByPre(root.left);
        
        res += serialByPre(root.right);
        
        return res;
    }
    
    
}

解题思路2:

从题目中的第二个例子中可以看出,子树必须是从叶结点开始的,中间某个部分的不能算是子树,那么我们转换一下思路,是不是从T1的某个结点开始,跟T2的所有结构都一样,那么问题就转换成了判断两棵树是否相同,也就是Lintcode 469. Same Tree的问题了,这点想通了其实代码就很好写了,用递归来写十分的简洁,我们先从T1的根结点开始,跟T2比较,如果两棵树完全相同,那么返回true,否则就分别对s的左子结点和右子结点调用递归再次来判断是否相同,只要有一个返回true了,就表示可以找得到。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param T1: The roots of binary tree T1.
     * @param T2: The roots of binary tree T2.
     * @return: True if T2 is a subtree of T1, or false.
     */
    public boolean isSubtree(TreeNode T1, TreeNode T2) {
        // write your code here
        if(T2 == null)
            return true;
        if(T1 == null)
            return false;
        if(isSame(T1,T2) == true)
            return true;
        else
            return isSubtree(T1.left,T2) || isSubtree(T1.right,T2);
    }
    
    //判断T1与T2两棵树是否完全相等
    public boolean isSame(TreeNode T1 , TreeNode T2){
        if(T1==null && T2==null)
            return true;
        else if(T1==null || T2==null)
            return false;
        else if(T1.val != T2.val)
            return false;
        else
            return isSame(T1.left,T2.left) && isSame(T1.right,T2.right);

    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/82585076
245