算法题:二叉树A是否包含二叉树B的拓扑结构

Posted 范二er

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题:二叉树A是否包含二叉树B的拓扑结构相关的知识,希望对你有一定的参考价值。

1. 题目

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

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

/*
public class TreeNode 
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) 
        this.val = val;
    
*/
public class IdenticalTree 

    public boolean chkIdentical(TreeNode A, TreeNode B) 
            //write code here
    
    

2.思路

剑指Offer—面试题18:树的子结构这个题目跟上述类似,但是在刷题时候,碰到了一种情况。

按层次遍历TreeA1,2,3,4,5,6,7
按层次遍历TreeB1
这两的两棵树,TreeB是TreeA的拓扑结构吗?
答案是false;

为什么这么说?我也是想了一阵子才想明白:

TreeB的根节点为1,左孩子为null,右孩子为null;
TreeA的1左孩子为2,右孩子为3;
恍然大悟。

提供另外一种思路:
1. 利用前序遍历,将TreeA序列化为字符串stra,将TreeB序列化为字符换strb.
2. 其中TreeNode!=null时,序列化为val+"!",TreeNode==null时,序列化为"@!"
3. 最后返回的是stra.contains(strb);


3.代码

 public boolean chkIdentical(TreeNode A, TreeNode B) 
        // write code here
        String stra=preSerial(A);
        String strb=preSerial(B);
        return stra.contains(strb);
    

    public String preSerial(TreeNode node)
        StringBuilder sb=new StringBuilder();
        if(node==null)
            return "@!";
        

        sb.append(node.val+"!");
        sb.append(preSerial(node.left));
        sb.append(preSerial(node.right));
        return sb.toString();
    

4.感想

碰到这个题目,还是需要问清楚,TreeA1,2,3,4,5,6,7,TreeB1这种情况下返回的是true还是false;

以上是关于算法题:二叉树A是否包含二叉树B的拓扑结构的主要内容,如果未能解决你的问题,请参考以下文章

字符串练习题: 拓扑结构相同子树

OptimalSolution--二叉树问题子树与拓扑结构

[程序员代码面试指南]二叉树问题-树1是否包含树2的拓扑结构

常用算法思路分析系列字符串高频题集

二叉树-天然的递归

⭐算法入门⭐《二叉树》简单08 —— LeetCode 572. 另一棵树的子树