剑指offer 26.树的子结构

剑指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

来源:力扣(LeetCode)
链接:剑指offer 26.树的子结构

思路: 要想去判断B是不是A的子结构,就要去把A的每一个节点当作根节点去和B比较,这里用的比较的办法是递归。
递归的过程中有三个条件:
(1) 如果 A–>val != B–>val,说明B不是A的子结构
(2) 如果递归到 A == NULL,则说明A树遍历完还没有匹配到B数,B不是A的子结构
(3) 如果递归到 B == BULL,则说明B树遍历完成,B是A的子结构

C代码如下:

bool judge(struct TreeNode* A, struct TreeNode* B) {
    if(B == NULL) return true;
    if(A == NULL) return false;
    if(A->val != B->val) return false;
    //确定一个根节点然后去匹配
    return judge(A->left,B->left) && judge(A->right,B->right); 
}


bool isSubStructure(struct TreeNode* A, struct TreeNode* B){
    if((A == NULL) || (B == NULL)) return false;
    //遍历A树,把每个节点作为一个根节点传入judge()函数中判断
    return judge(A,B) || isSubStructure(A->left,B) || isSubStructure(A->right,B);
}


示例:
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值