判断树子结构

// 剑指-26 B 是否为 A 的子结构
var isSubStructure = function (A, B) {
    function fn(A, B) {
        // 剪枝
        if (flag || !A || !B) return;

        // 找到该节点,从本节点判断是不是其子结构
        if (A.val == B.val) {
            let que = [A, B];
            let tmp = true; // 没有踩中以下任意一种情况就为true
            while (que.length) {
                let b = que.pop();// 注意出栈的顺序
                let a = que.pop();
                if (a.val !== b.val) { tmp = false; break; }
                if (b.left != null && a.left == null) { tmp = false; break; }
                if (b.left != null) que.push(a.left, b.left);
                if (b.right != null && a.right == null) { tmp = false; break; }
                if (b.right != null) que.push(a.right, b.right);
            }

            // 判断flag。改了这里时间又多打败了20%
            tmp && (flag = true);            
        }

        // 分别查看左/右树是不是包含了 B
        fn(A.left, B);
        fn(A.right, B);
    }
    var flag = false;
    fn(A, B);
    return flag;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值