面试算法题解----拓扑结构相同的子树问题

本文探讨如何解决面试中遇到的算法问题,即检查一棵二叉树A中是否存在与另一棵树B拓扑结构完全相同的子树。通过提供一个名为chkIdentical的函数,利用递归的方法来判断两棵树是否同构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。

给定两棵二叉树的头结点AB,请返回一个bool值,代表A中是否存在一棵同构于B的子树。

普通解法为二叉树遍历+匹配问题,考察tree1中每个节点为头的子树是否与tree2一致,时间复杂度为O(N*M)
N:tree1节点数 M:tree2节点数
最优解法为 二叉树序列化 + KMP算法 时间复杂度为O(N+M):将tree1和tree2都序列化成字符串str1,str2,然后看str1中是否包含str2,是一个字符串匹配问题。用KMP算法即可,代码如下:


public class IdenticalTree {

    public boolean chkIdentical(TreeNode A, TreeNode B) {

        // write code here
        if(B==null)
            return false;
        if(A==null&&B!=null)
            return false;
        String a_str = TreeToString(A);
    String b_str = TreeToString(B);
    return (a_str.indexOf(b_str)==-1)?false:true;
    }
     public String TreeToString(TreeNode tree){
    String str;
    if(tree == null)
    return "# ";
    str = tree.val + " " + TreeToString(tree.left) + " " + TreeToString(tree.right);
    return str;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值