题目大意:
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
许多题目可以转化为字符串类型题目进行求解。此题判断A中是否有一棵拓扑结构和B相同的子树,可以遍历两棵树为两个字符串(这里遍历和普通前序/中序/后序遍历不同),再用KMP算法进行判断即可。
kmp算法可用来判断某字符串B是不是字符串A的子串,详见如何更好的理解和掌握 KMP 算法?
首先明确子树的定义:只要包含了一个结点,就得包含这个结点下的所有节点.
刚刚提到,这道题中遍历出来的字符串不能仅仅存储数字,还要存储这个节点是父节点还是子节点。
如
和
如果只看非空节点遍历结果,{1}包含在{1,2,4,5,3,6,7}中,后面一棵树应当是前面一棵树的子树才对。 但是第二棵树中1的两个子节点都为null,和前面树中1的两个节点不一致,不符合子树的定义。
因此