题目
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
解题思路
先序遍历,找到一个A上的节点和B的根节点的值相同时,开始判断B是否和这个节点的A是不是相同的结构。
判断两个树是否是相同的子结构,意味着,在相同位置,都为空,或者值相同。然后递归判断A和B的左右节点。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* public var val: Int
* public var left: TreeNode?
* public var right: TreeNode?
* public init(_ val: Int) {
* self.val = val
* self.left = nil
* self.right = nil
* }
* }
*/
class Solution {
func isSubStructure(_ A: TreeNode?, _ B: TreeNode?) -> Bool {
if A == nil || B == nil {
return false
}
if A?.val == B?.val {
if _judge(A, B) {
return true
}
}
return isSubStructure(A?.left, B) || isSubStructure(A?.right, B)
}
func _judge(_ A: TreeNode?, _ B: TreeNode?) -> Bool {
if B == nil {
return true
}
if A == nil {
return false
}
if A?.val == B?.val {
return _judge(A?.left, B?.left) && _judge(A?.right, B?.right)
}
return false
}
}