LintCode - 子树(普通)

版权声明:本文为博主原创文章,未经博主允许不得转载。

难度:容易
要求:

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

思路

    /**
     * @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) {
        if (T2 == null) {
            return true;
        }
        if (T1 == null) {
            return false;
        }
        
        if (isEqual(T1, T2)) {
            return true;
        }
        if (isSubtree(T1.left, T2) || isSubtree(T1.right, T2)) {
            return true;
        }
        return false;
    }
    
    private boolean isEqual(TreeNode T1, TreeNode T2) {
        if (T1 == null || T2 == null) {
            return T1 == T2;
        }
        if (T1.val != T2.val) {
            return false;
        }
        return isEqual(T1.left, T2.left) && isEqual(T1.right, T2.right);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,982评论 1 31
  • 基于树实现的数据结构,具有两个核心特征: 逻辑结构:数据元素之间具有层次关系; 数据运算:操作方法具有Log级的平...
    yhthu阅读 9,826评论 1 5
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,392评论 0 2
  • 题目 有两个不同大小的二进制树: T1有上百万的节点; T2有好几百的节点。请设计一种算法,判定 T2是否为 T1...
    六尺帐篷阅读 3,674评论 0 3
  • 今天上班差点迟到就差八秒钟,弄得我心里很着急,每天还要端水、刷锅、做粥、白灼菜品、加热肠粉,切猪肝,猪腰,鱿鱼丝,...
    a512e5e18420阅读 2,166评论 1 1

友情链接更多精彩内容