「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
前言
前面我们算过完全二叉树的节点个数,也找过二叉搜索树第k大的节点,今天我们来比较两个二叉树A、B之间的关系,探究B是否为A的子结构。
题目描述
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sh… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 判断B树是否为A树的子结构,前提是B不能为空树,那么A肯定也不是空树,因为没有谁是空树的子结构,所以要想B是A的子结构首先得满足A和B不是空树;
- A和B不为空后,先拿B的根节点去A里找,看有没有与之相同的,没有则说明B不是A的子结构,有则进入下一步循环
- 既然找到了与B相同的根节点,如果想要B为A的子结构,那就得保证接下来B的左右子树均与A的左右子树相同
开始解题
var isSubStructure = function(A, B) {
// 用双非的原因:因为可能需要作为布尔值返回
// (compare(A,B) 比较当前A节点与B 如果当前节点与B不等,就去找A的左或有节点
return (!!A && !!B) && (compare(A,B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)) ;
}
var compare = function(A, B) {
// 第一次进函数的时候A和B都是不为空的,如果第一次判断相等了就会进入递归,在递归调用时A和B就可能会为空了
// 如果B为空了,说明B前面的节点都相等了,就可以决定B为A的子结构了
if(!B) return true;
// 走到这一步说明当前B不为空,而A为空,说明A没有完全包含B,那么B就不是A的子结构
// 只要在当前递归中A中与B有一个节点不同那就证明A没有完全包含B
if(!A || A.val !== B.val) return false;
return compare(A.left, B.left) && compare(A.right, B.right);
}