LeeCode 剑指 Offer 26. 树的子结构

221 阅读1分钟

题目

输入两棵二叉树AB,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
BA的子结构, 即 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
    }
}