题目连结:572. Subtree of Another Tree
题目主题:Tree, Depth-First Search, String Mathcing, Binary Tree, Hash Function
讲完几个常见的演算法主题以後,这两天会开始分享 Hash 相关的主题。
我认为 Hash 的核心概念是简化一个复杂的资料,让资料有更好的效能处理问题,这个简化不管是将资料变成数字或是字串都是有可能的。
另外有两个重点:
建议可以看看LeetCode原本的题目说明,这边是用我的方式说明题目,参考就好。
题目会给两个 Binary Tree 分别为 root 及 subRoot,如果 subRoot 有出现在 root 之中并且结构及节点值都相同,回传 True,不符合条件回传 False。
约束:
范例1
输入: root = [3,4,5,1,2], subRoot = [4,1,2]
输出: true
解说: 上图是LeetCode提供的范例图,很明显可以看到 subRoot 有出现在 root 里面且结构及节点值都相同。
范例2
输入: root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出: false
解说: 上图是LeetCode提供的范例图,虽然看得到 [4, 1, 2] 有出现在 root 之中,但最终输出为 false 的原因是 2 节点的结构并不相同,root 这边多 2 出现了子节点。
建议到这边先停下来,尝试自己解解看,若没有想法可再继续走下去。
范例:
root = [5, 4, 1, 7, 2]
subRoot = [4, 7, 2]
上图是过程中,分别会先将 root 及 subRoot 这两个复杂的树简化成一个字串,之後便可以直接用这两个字串比对出subRoot 是否有出现在 root 中,以这个范例来说是有比对到 subRoot 转成的字串是有出现在 root 字串之中的红色底线部份,因此会回传 True。
这个树转换成字串的过程,是运用了Preorder、Inorder、Postorder的方式组成的字串,每个数字至少会被经过三次,这样可以确认到结构的长相。
上图中,黑色数字是Preorder经过时纪录的、红色数字是Inorder经过时纪录的、绿色数字就是Postorder经过的,这样转换出来的字串便可完整的去确认 root 中是否有出现跟 subRoot 结构及节点值都相同的树。
若因为没想法而走到这边,建议看完想像以後再给自己一次机会试一次。
class Solution:
def convertString(self, root, rootStr = ''):
if root == None: return rootStr
rootStr += str(root.val)
rootStr = self.convertString(root.left, rootStr)
rootStr += str(root.val)
rootStr = self.convertString(root.right, rootStr)
rootStr += str(root.val)
return rootStr
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
subRootStr = self.convertString(subRoot)
rootStr = self.convertString(root)
return subRootStr in rootStr
若内容有什麽问题或建议欢迎一起交流:)
感谢您今天愿意花时间看完这篇文章~~~~
Next:1. Two Sum
昨天已经学会新增页面和跳页功能了 但如果单纯跳页好像没什麽用 势必要传一点讯息过去另一页 今天就来学...
Uptime - 掌握系统的生命徵象 系列文章 (1/4) - 我们要观测的生命徵象是什麽? (2/...
再上篇中撷取到的讯息只会即时传到聊天室,并不会保存下来。要保存讯息的话,就要把讯息保存到资料库。 建...
这篇的主题是因为有朋友提到 Database vs Data warehouse 的差别,所以就开始...
变数 & 记忆体 变数的内容储存於记忆体中,记忆体就像是有很多格子的柜子,每格都会有一个编号...