剑指Offer26.树的子结构Golang版
1. 问题描述
输入两棵二叉树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
2. 思路
- 在A中搜索,查找到第一个和B相同的节点
- 从找到的节点开始,比较A中是否存在B相同的部分。
3. 代码
3.1. 代码思路
从A的Root开始,向下是否含有和B相同
/**
* 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
}
return isSub(A, B)
}
func isSub(A *TreeNode, B *TreeNode) bool {
if B == nil {
return true
}
if A == nil || A.Val != B.Val {
return false
}
return isSub(A.Left, B.Left) && isSub(A.Right, B.Right)
}
从A的任意子节点开始,向下是否含有和B相同
func isSubStructure(A *TreeNode, B *TreeNode) bool {
if A == nil || B == nil {
return false
}
return isSub(A, B) || isSubStructure(A.Left) || isSubStructure(A.Right)
}
3.2. 深度优先遍历,查找任意节点开始,是否有子树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSubStructure(A *TreeNode, B *TreeNode) bool {
var res bool
if A == nil || B == nil {
return false
}
dfs(A, B, &res)
return res
}
func dfs(A *TreeNode, B *TreeNode, res *bool) {
if A == nil {
return
}
if A.Val == B.Val && isSub(A, B){
*res = true
return
}
dfs(A.Left, B, res)
dfs(A.Right, B, res)
}
func isSub(A *TreeNode, B *TreeNode) bool {
if B == nil {
return true
}
if A == nil || A.Val != B.Val {
return false
}
return isSub(A.Left, B.Left) && isSub(A.Right, B.Right)
}