输入两棵二叉树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子树根结点相同的结点,然后判断每个结点是否与包含这个子树。
JavaScript代码
/**
* 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) {
<!-- 如果树有任意一颗为空,题目中说都不符合要求,直接返回false -->
if (!A || !B)
return false;
<!-- just函数判断两棵树是否相等 -->
const just = (a, b) => {
if (!b) //(!b)等价于((!a&&!b)||(a&&!b))如果找到叶子结点说明当前路径符合,返回true
return true;
if (!a && b || a.val !== b.val)
return false; //如果a树为空且b树不为空,或者两个树结点的val不相等说明b不是a不是子树关系,返回false
return just(a.left, b.left) && just(a.right, b.right);//当所有路径都为true,返回true
}
<!-- Map函数用来查询可能是 -->
const Map = (A) => {
let arr = [];
if (!A)
return arr; //遇到叶子结点返回空数组
if (A.val === B.val)
arr.push(A); //找到根节点相同的压入数组
arr.push(...Map(A.left)) //遍历左子树
arr.push(...Map(A.right))//遍历右子树
return arr;
}
let nodeArr = Map(A);
let res = false;
<!-- 如果没找到这个结点,直接返回false -->
if (!nodeArr.length)
return res;
<!-- 遍历nodeArr,查找子树是否匹配 -->
nodeArr.map(item => {
<!-- 如果res===true,就不在更新res -->
res = !res ? just(item, B) : res;
})
return res;
};