标签:头结点 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