lintcode 容易题:Subtree 子树

题目:

子树

有两个不同大小的二叉树: 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 完全相同。

解题:

感觉通过直接递归就可以解决,但是下面的程序运行到60%的测试数据结果就不对了

Java程序:

/**
 * 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, T2: The roots of binary tree.
     * @return: True if T2 is a subtree of T1, or false.
     */
    public boolean isSubtree(TreeNode T1, TreeNode T2) {
        // write your code here
        if(T1==null && T2==null)
            return true;
        if(T1==null)
            return false;
        if(T2==null)
            return true;
        if(T1.val==T2.val&& T1.left==null && T2.left==null && T1.right==null && T2.right==null)
            return true;

        if(T1.val!=T2.val){
            boolean lft = isSubtree(T1.left,T2);
            boolean rit = isSubtree(T1.right,T2);
            if(lft || rit)
                return true;
        }else{
            boolean lft = isSubtree(T1.left,T2.left);
            boolean rit = isSubtree(T1.right,T2.right);
            if(lft && rit)
                return true;
        }
        return false;
    }
}

上面的程序中,当当前节点相同和不相同的时候,都是自身递归,在网上看到,对应节点相同的时候,要单独搞个递归判断

基本流程:

若T1.val!=T2.val,分布判断两个子树是否和T2相等,只有有一个相等就可以

若T1.val==T2.val,判断是否相等,若不相等,分布对其两个子树再判断

上面程序,可以感觉到走了个圈。

网上有的程序写的很简单。。。

Java程序:

/**
 * 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, T2: The roots of binary tree.
     * @return: True if T2 is a subtree of T1, or false.
     */
    public boolean isSubtree(TreeNode T1, TreeNode T2) {
        // write your code here
        if(T1==null && T2==null)
            return true;
        if(T1==null)
            return false;
        if(T2==null)
            return true;

        if(T1.val!=T2.val){
            boolean lft = isSubtree(T1.left,T2);
            boolean rit = isSubtree(T1.right,T2);
            if(lft || rit)
                return true;
        }else{
            boolean res = isEqual(T1,T2);
            if(res)
                return true;
            else {
            boolean lft = isSubtree(T1.left,T2);
            boolean rit = isSubtree(T1.right,T2);
            if(lft || rit)
                return true;
            }
        }
        return false;
    }
    public boolean isEqual(TreeNode T1,TreeNode T2){
        if(T1==null && T2==null)
            return true;
        if(T1==null)
            return false;
        if(T2==null)
            return false;
        if(T1.val==T2.val){
            boolean lft = isEqual(T1.left,T2.left);
            boolean rit = isEqual(T1.right,T2.right);
            if(lft && rit)
                return true;
        }
        return false;
    }
}

总耗时: 5048 ms

Python程序:

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""
class Solution:
    # @param T1, T2: The roots of binary tree.
    # @return: True if T2 is a subtree of T1, or false.
    def isSubtree(self, T1, T2):
        # write your code here
        if(T1==None and T2==None):
            return True
        if T1==None:
            return False
        if T2==None:
            return True
        if T1.val!=T2.val:
            lft = self.isSubtree(T1.left,T2)
            rit = self.isSubtree(T1.right,T2)
            if lft or rit:
                return True
        else:
            res = self.isEqual(T1,T2)
            if res:
                return True
            else:
                lft = self.isSubtree(T1.left,T2)
                rit = self.isSubtree(T1.right,T2)
                if lft or rit:
                    return True
        return False

    def isEqual(self,T1,T2):

        if T1==None and T2==None:
            return True
        if T1==None:
            return False
        if T2==None:
            return False
        if T1!=None and T2!=None and T1.val==T2.val:
            lft = self.isEqual(T1.left,T2.left)
            rit = self.isEqual(T1.right,T2.right)
            if lft and rit:
                return True
        return False

总耗时: 640 ms

时间: 2024-08-01 21:45:30

lintcode 容易题:Subtree 子树的相关文章

LintCode刷题笔记-- LongestCommonSquence

题目描述: Given two strings, find the longest common subsequence (LCS). Your code should return the length of LCS. 解题思路: 这一题是非常经典的动态规划问题,在解题思路上可以按照经典的动态规划的解法,这是在系统学习动态规划之后第一个解决的LintCode上的问题: 1.子问题划分 给出两个字符串的A,B,两个字符串长度分别为lenA,lenB,求出两个字符串的LCS: 这划分为子问题:A.

动态规划--LintCode简单题

1.爬楼梯 题目:假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 分析:一次只能爬一步或者两步,所以走i步可由走i-1步的方法数和走i-2步的方法数相加获得: 设dp[i]为走i步的方法数目,则dp[i]=dp[i-1]+dp[i-2]; 注意:边界问题,由上面的方程可知道 i 由2开始,且dp[0]=dp[1]=1; 代码: class Solution {public:    /**     dp[i]=dp[i-1]+dp[i-2]

LintCode数组题总结

做算法题的时候,几乎不可避免要跟数组打交道.在LintCode上数组那一章有这么一些题目: 1)547. Intersection of Two Arrays 比较简单.要求找到2个数组的交集,简单点的方法就是用2个hashSet,第一个HashSet存第一个数组的元素.然后扫描第二个数组,如果第二个数组中的元素在第一个HashSet中出现了,那么就把它加到第二个HashSet中.最后第二个HashSet就是两个数组的交集了. 2)138. Subarray Sum 要求在一个数组中找到一个子数

lintcode 容易题:Longest Words 最长单词

题目: 最长单词 给一个词典,找出其中所有最长的单词. 样例 在词典 { "dog", "google", "facebook", "internationalization", "blabla" } 中, 最长的单词集合为 ["internationalization"] 在词典 { "like", "love", "hate"

LintCode刷题——不同的二叉查找树I、II

不同的二叉查找树I: 题目内容: 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例: 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 算法分析: 先来看一下二叉查找树的特点,当选定一个节点i作为中间节点时: ①位于该节点左子树中的所有节点均小于i,假设该节点的左子树的排列情况有m种: ②位于该节点右子树中的所有节点均大于i,假设该节点的右子树的排列情况有n种: ③综合①和②,当节点i

LintCode链表题总结

由于链表本身结构的单一性,链表的题目很少会有很大的变种,基本都是围绕几个基本的考点出题目.所以链表的题目比较好掌握,但是链表的题目又不太容易一次就AC通过,由于边界情况未考虑.空指针(比如head.next不存在但是却给head.next赋值了,就会抛出nullpointer的错误).越界等边界情况,我们需要在测试用例的时候多考虑边界条件.在模拟计算的时候一定要用纸和笔把中间的操作过程给画出来,这样比较容易形成思路. 在LintCode的ladder1中,链表那一章有如下这一些题目: 此外,Li

LeetCode算法题-Subtree of Another Tree(Java实现)

这是悦乐书的第265次更新,第278篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第132题(顺位题号是572).给定两个非空的二进制树s和t,检查树t是否具有完全相同的结构和具有子树s的节点值. s的子树是一个树,由s中的节点和所有节点的后代组成. 树也可以被视为自己的子树.例如: 鉴于树s: 3 / 4 5 / 1 2 鉴于树t: 4 / 1 2 返回true,因为t具有相同的结构和节点值,其子树为s. 鉴于树s: 3 / 4 5 / 1 2 / 0 鉴于树t:

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1

lintcode 容易题:strStr 字符串查找

题目: 字符串查找 字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数.你的任务是实现这个函数. 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始). 如果不存在,则返回 -1. 样例 如果 source = "source" 和 target = "target",返回 -1. 如果 source = "abcdabcdefg" 和