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--二叉树问题子树与拓扑结构的主要内容,如果未能解决你的问题,请参考以下文章