第十八题 剑指 Offer 26. 树的子结构

剑指 Offer 26. 树的子结构

题目描述

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:
在这里插入图片描述

示例1

输入:A = [1,2,3], B = [3,1]
输出:false

示例2

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制

0 <= 节点个数 <= 10000

思路

DFS

  • 判别传入的参数中 B树中的节点是否为空 为空则返回 true就是说传入的节点已经是空的 有可能题目输入的B节点是空的 也有可能是已经到达B树的终点 所以返回 true
  • 判断传入的A树节点是否为空 为空则表示与B树不匹配 返回false
  • 如果当前A树节点的值与B树节点的值相等,说明此节点匹配继续 分别传入 A树B树左节点 和 A树B树右节点 继续搜索
  • 注意:不一定A树的根节点作为对比的根节点(即B的根节点) A的左节点 和 右节点都有可能

代码

/**
 * 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=== null || B=== null) return false;
    let dfs = function(node, B){
       // 到达终点 或 B本就是为空
        if(B === null) return true;
        //A树的节点不匹配了
        if(node === null) return false;
        //A B树当前节点相等 继续搜索
        if(node.val === B.val){
            return dfs(node.left, B.left)&&dfs(node.right, B.right);
        }
        else{
            return false;
        }
    }
    // 更换对比的根节点
    return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值