Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
输入两棵二叉树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为空,B匹配完成,返回true 二、节点A为空,返回false 三节点A与B的值不同,返回False
- 递归判断:lsame判断A的左节点和B的右节点是否相同,rsame判断A的右节点和B的右节点是否相同。
- 主函数确保AB同时不为nil才可以,递归遍历,判断A和B是否相同 ,判断A的左子树和B是否相同,判断A的右子树和B是否相同,如果有一个相同则判定合适。
三、AC 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSubStructure(A *TreeNode, B *TreeNode) bool {
return (A != nil && B != nil) && (sameTree(A,B) || isSubStructure(A.Left,B) || isSubStructure(A.Right,B))
}
//判断两个节点是否相同
func sameTree(A *TreeNode,B *TreeNode) bool {
if B == nil {
return true
}
if A == nil {
return false
}
if A.Val != B.Val {
return false
}
lsame := sameTree(A.Left,B.Left)
rsame := sameTree(A.Right,B.Right)
return lsame && rsame
}
四、总结
树的子结构需要注意的点是,当B为nil时,代表B已经到子节点,返回true。并且主函数中药判断A,B是否相同,以及递归判断A.Left和B,以及A.Right和B,要进行双重递归。