题目
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
案例
- 输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
- 输出:true
分析
- 需要一个个去遍历节点,如果当前节点的值等于B节点的根节点的值
- 那就从此节点开始,遍历其和B链表的所有节点
- 如果不符合,则继续往下遍历A链表
解题代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
// 判断是否是空结构
if(root1 == null || root2 == null) return false;
boolean flag = topCompare(root1, root2);
if(!flag)
{
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
return flag;
}
// 判断从根节点开始是否相等
private boolean topCompare(TreeNode root1, TreeNode root2)
{
//必须放在下一行代码前面,因为两者同时为null的时候,其实是成功的
if(root2 == null) return true;
if(root1 == null) return false;
if( root1.val == root2.val )
{
return topCompare(root1.left, root2.left)
&& topCompare(root1.right, root2.right);
} else {
return false;
}
}
}
- 总结
- 这种寻找子结构的让我想到了在字符串中寻找是否包含子字符串的情况
- 正常情况下,是需要一个个字符遍历,一旦第一个和子串第一个相等的时候,然后开始比较往后的字符串是否相等,时间复杂度为O(mn)
- 但是看到一个算法,KMP算法,经过其优化之后,时间复杂度可缩短至O(m+n)
- KMP算法详情:字符串匹配的KMP算法