【LeetCode】剑指 Offer 26. 树的子结构 – Go 语言题解

导读:本篇文章讲解 【LeetCode】剑指 Offer 26. 树的子结构 – Go 语言题解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


一、题目描述

输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构)

B 是 A 的子结构, 即 A 中有出现和 B 相同的结构和节点值。

例如:

给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B:

   4 
  /
 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000


二、我的题解

树 B 是树 A 的子结构有两种可能性:

  • 树 B 是树 A 的上半结构:如果树 B 的节点和树 A 节点相等,这时如果按照广度优先遍历两树,按层次,那么两树的队列顺序一定一致,一直对比两队列直到树 B 结束就说明相等。
  • 树 B 是树 A 的下半结构:这时,树 B 是树 A 的子树,这时按照广度优先的话,两树的队列就不相等(因为层数不同),这时使用深度优先遍历,如果遇到树 A 中和树 B 根节点值相等的节点,就使用递归再对比他们的左右子树是否相等。

我的方法就是先判断树 B 是否是树 A 的上半结构,如果不是,再判断树 B 是否是树 A 的下半结构:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSubStructure(A *TreeNode, B *TreeNode) bool {
    if A == nil || B == nil{
        return false
    }

    que := []*TreeNode{A}
    qub := []*TreeNode{B}
    i := 0
    tag := false

    //如果子树 B 的根节点和树 A 相等,那么 B 有可能是 A 树的上半结构,这时广度优先、层次遍历就行
    for i < len(que) && i < len(qub) && que[i].Val == qub[i].Val {
        tag = true

        if que[i].Left != nil{
            que = append(que,que[i].Left)
        }
        if que[i].Right != nil{
            que = append(que,que[i].Right)
        }

        if qub[i].Left != nil{
            qub = append(qub,qub[i].Left)
        }
        if qub[i].Right != nil{
            qub = append(qub,qub[i].Right)
        }
        i++
    }
    //将子树 B 遍历完了,证明子树 B 真的是 A 树的上半结构
    if tag == true && i == len(qub){
        return true
    }

	//如果不是上半结构,进入 B 树是 A 树的下半结构的判断,下半结构的判断使用深度优先遍历(递归)
    for i < len(que) {
        if que[i].Val == B.Val && issubtequal(que[i].Left , B.Left) && issubtequal(que[i].Right , B.Right){
            return true
        }
        if que[i].Left != nil{
            que = append(que,que[i].Left)
        }
        if que[i].Right != nil{
            que = append(que,que[i].Right)
        }
        i++
    }
    return false
}


func issubtequal(A *TreeNode, B *TreeNode) bool{
    if A == nil && B == nil{
        return true
    }else if A != nil && B == nil{
        return false
    }else if A == nil && B != nil{
        return false
    }else{
        if A.Val == B.Val{
            return issubtequal(A.Left,B.Left) && issubtequal(A.Right,B.Right)
        }else{
            return false
        }
    }
}

评判结果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118962.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!