NC98:判断t1树中是否有与t2树拓扑结构

判断t1树中是否有与t2树拓扑结构完全相同的子树

http://www.nowcoder.com/questionTerminal/4eaccec5ee8f4fe8a4309463b807a542

方法1:递归
时间复杂度:O ( M ∗ N )
当root1什么都没有的时候,在root1里面找不到任何节点直接返回false。
当root2提前终止了,此时还没有遇到不符合root1树的节点,直接返回true。

    public boolean isContains (TreeNode root1, TreeNode root2) {
        // write code here
        if(root1==null){
            return false;
        }
        return isContains(root1.left,root2) || isContains(root1.right,root2) || isSubTree(root1,root2);
    }

    public boolean isSubTree(TreeNode root1,TreeNode root2){
        if(root1==null && root2==null){
            return true;
        }
        if(root1==null || root2==null || root1.val!=root2.val){
            return false;
        }
        return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
    }

方法2:中序遍历+strings.contains()
将二叉树中序遍历之后,如果t2的序列化结果能在t1中找到能说明t2是t1的子树(KMP算法),当然这里直接调用 strings.contains()判断也是可以,反而性能更好一点

public boolean isContains (TreeNode root1, TreeNode root2) {
        // write code here
        StringBuffer res1=new StringBuffer();
        StringBuffer res2=new StringBuffer();
        preOrder(root1,res1);
        preOrder(root2,res2);
        if(res1.toString().contains(res2.toString())){
            return true;
        }
        else{
            return false;
        }
    }
    public void preOrder(TreeNode root,StringBuffer res){
        if(root==null){
            return;
        }
        preOrder(root.left,res);
        res.append(root.val);
        preOrder(root.right,res);
    }

方法3:序列化(中序)+KMP

名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论
大哥,错误代码误导人,递归你是判断两个二叉树是否相等吧,还好我没抄
1 回复 分享
发布于 2021-03-23 09:24
这道题用中序遍历的方法在牛客网里跑出来是错解,但是我在ide里面跑,是正确的。神奇。。
点赞 回复 分享
发布于 2021-01-30 21:00

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
评论
6
1
分享
牛客网
牛客企业服务