黄哥Go语言编程: 572 题Subtree of Another Tree 解题思路

355 阅读1分钟
原文链接: zhuanlan.zhihu.com

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图标