大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
剑指 Offer 26. 树的子结构
输入两棵二叉树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数的节点是否全等于A数的节点,具体实现的时候,我们只需要递归的判断,当前节点相等,左节点相等,右节点相等即可;
- 然后递归的边界是,当B树没有子节点了为止,如果A树没子节点了,但是B树还有剩余,说明也不是子树;
- 然后再递归的去判断A树中存不存在与B树头节点值相等的节点,如果存在的话,就执行一次全等判断,如果满足条件则跳出递归,否则拿子节点进行递归判断即可。
实现
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} A
* @param {TreeNode} B
* @return {boolean}
*/
var isSubStructure = function(A, B) {
// 题目中说了空节点不是任何树的子树
if (!A || !B) {
return false;
}
// 如果当前值相等,那么递归判断是否全等
if (A.val === B.val && isEqualNode(A, B)) {
return true;
}
// 如果当前节点不满足条件,递归看子节点满不满足
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
};
function isEqualNode(A, B) {
// 如果没有B树节点了,说明全部符合条件
if (!B) {
return true;
}
// 如果到了这一步,说明还有B树节点,这时如果没有A树节点说明不符合条件
if (!A) {
return false;
}
// 递归判断当前值,左右子节点都符合即可
return A.val === B.val && isEqualNode(A.left, B.left) && isEqualNode(A.right, B.right);
}
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。