码迷,mamicode.com
首页 > 其他好文 > 详细

OptimalSolution(2)--二叉树问题(4)子树与拓扑结构

时间:2018-09-12 21:14:25      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:头结点   node   直接   vat   字符   str   序列化   strong   --   

  一、判断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(2)--二叉树问题(4)子树与拓扑结构

标签:头结点   node   直接   vat   字符   str   序列化   strong   --   

原文地址:https://www.cnblogs.com/BigJunOba/p/9637185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!