572 题Subtree of Another Tree 解题思路,该题虽然是一个easy 题目,如果基础概念不清楚
或者没有学过数据结构和算法的朋友,是完全无从下手的。(所以刷题前要学习数据结构和算法)
将大问题化解为小问题,小问题去套已经解决了的问题,是解决问题的基本方法。
1、判断一个二叉树是不是另一个二叉树的子树,这个问题化解为t 树是不是s 树的左子树和右子树的子树的子问题。
2、如何判断二个二叉树是不是同一个颗树的问题,LeetCode 100题已经解决了。
3、 用dfs 遍历s 树,找到s树的全部左子树和右子树的slice 表。
4、再遍历slice 表,调用isSameTree 函数,到此问题完美解决。
看下面黄哥按照上面的思路写的代码,用Go 语言实现的,有兴趣的朋友,可以用Python 去实现一下
# 黄哥Go语言 黄哥所写
func isSubtree(s *TreeNode, t *TreeNode) bool {
var nodes []*TreeNode
dfs(s, &nodes)
// fmt.Println(nodes)
for _, node := range nodes {
if isSameTree(node, t) {
return true
}
}
return false
}
// dfs 深度遍历找出所有左子树和右子树的slice 黄哥Go编程 黄哥所写
func dfs(root *TreeNode, res *[]*TreeNode) {
if root == nil {
return
}
*res = append(*res, root)
dfs(root.Left, res)
dfs(root.Right, res)
}
// isSameTree 判断二个二叉树是不是同一颗树 黄哥Go编程 黄哥所写
func isSameTree(p *TreeNode, q *TreeNode) bool {
if (p == nil && q != nil) || (p != nil && q == nil) {
return false
}
if p == nil && p == nil {
return true
}
if p.Val == q.Val {
return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)
}
return false
}黄哥Go 语言培训大纲
pythonpeixun/articlegithub.com