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

Posted bigjunoba

tags:

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

  一、判断t1树是否包含t2树全部的拓扑结构

          1
        /           2      3                       2
     /       /                     /      4    5  6    7                  4    5
   /    /                         /
  8  9 10                         8                               返回:true

  解法(O(M×N)):如果t1中某棵子树头结点和t2头结点的值一样,则从这两个头结点开始匹配,匹配的每一步都是让t1上的节点跟着t2的先序遍历移动,每移动一步,都检查t1的当前节点和t2当前节点的值是否一样。如果匹配的过程中发现有不匹配的过程,直接返回false,那么再去寻找t1的下一棵树。

    public boolean contains(Node t1, Node t2) {
        return check(t1, t2) || contains(t1.left, t2) || contains(t1.right, t2);
    }

    private boolean check(Node h, Node t2) {
        if (t2 == null) return false;
        if (h == null || h.val != t2.val) return false;
        return check(h.left, t2.left) && check(h.right, t2.right);
    }

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

          1
        /           2      3                       2                          2
     /       /                     /                         / 
    4    5  6    7                  4    5                     4   5
       /                               /                       
     8 9                              8  9  返回:true            8     返回:false

  如果t1的节点数为N,t2的节点数为M  

  1.时间复杂度为O(N×M)的方法:对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的复杂度为O(M),t1的子树一共有N棵,所以时间复杂度是O(N×M)

  2.时间复杂度为O(N+M)的方法:先将t1树前序遍历序列化成字符串“1!2!4!#!8!#!#!5!9!#!#!#!#!3!6!#!#!7!#!#!”,而t2树前序遍历序列化为字符串“2!4!#!8!#!#!5!9!#!#!”(t3树前序遍历序列化为字符串“2!4!#!8!#!#!5!#!#!”),也就是验证t2str是否是t1str的子串即可,可以用KMP算法在线性时间内解决。所以t1序列化的时间复杂度为O(N),t2序列化的时间复杂度是O(M),KMP解决两个字符串的匹配问题O(M+N),所以时间复杂度是O(M+N)。

  

  

以上是关于OptimalSolution--二叉树问题子树与拓扑结构的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历与建立

数据结构与算法 —— 二叉树

二叉树&满二叉树与完全二叉树

二叉树及其遍历

数据结构二叉树

数据结构-二叉树的存储结构与遍历